我对SWIFT非常陌生,我遇到了一个问题,即当状态变量更改时,UI不会更改.

我的内容视图.swft:

struct ContentView: View {
    @State private var loginModelInstance = LoginViewModel()
    
    
    var body: some View {
        if (!loginModelInstance.loginSuccessful)
        {
            LoginViewController(loginViewModel: $loginModelInstance)
        }
        else
        {
            FileUploaderView()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我的登录视图控制器

struct LoginViewController: View {
    
    @Binding var loginViewModel : LoginViewModel
    
    var body: some View {
        
        SignInWithAppleButton(.signIn,
                              onRequest: loginViewModel.configure,
                              onCompletion: loginViewModel.handle
        )
        .frame(height: 50)
        .padding()
    
    }
    
}

struct LoginViewController_Previews: PreviewProvider {
    @State static var loginModelInstancePreview = LoginViewModel()
    
    static var previews: some View {
        LoginViewController(loginViewModel: $loginModelInstancePreview)
    }
}

我的文件上传程序:

import SwiftUI

struct FileUploaderView: View {
    var body: some View {
        Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
    }
}

struct FileUploaderView_Previews: PreviewProvider {
    static var previews: some View {
        FileUploaderView()
    }
}

我的登录视图模型

class LoginViewModel: ObservableObject
{
    
    func configure(request: ASAuthorizationAppleIDRequest)
    {
        request.requestedScopes = [.fullName, .email]
        // request.nonce = ""
    }
    
    func handle(authResult: Result<ASAuthorization, Error>) -> Void
    {
        switch authResult
        {
        case .success(let authorization):
            self.loginSuccessful = true
            self.objectWillChange.send()
            print("Login for \(authorization) has been \(self.loginSuccessful)")
            
        case .failure(let error):
            self.loginSuccessful = false
            print(error)
            
        }
    }
    
    @Published var loginSuccessful: Bool = false
}

我已经研究了相关的问题: 12

然而,我没能让观点改变.

推荐答案

您错误地使用了视图模型的属性包装.

struct ContentView: View {
    @State private var loginModelInstance = LoginViewModel()

应该是

struct ContentView: View {
    @StateObject var loginModelInstance = LoginViewModel()

struct LoginViewController: View {
    @Binding var loginViewModel : LoginViewModel

应该是

struct LoginViewController: View {
        @ObservedObject var loginViewModel : LoginViewModel

我建议多做一些关于SwiftUI基本概念的研究,for example here.

Swift相关问答推荐

WWDC Swift并发会话中的厨房服务示例令人困惑

在visionOS 1.0中已弃用';base Color';:请改用`Color`属性

一种函数,用于判断变量的类型是否为在SWIFT中作为参数传递的类型

如何增加 NSStatusBar 图像大小?

在扩展中创建通用排序函数

如何在visionOS中将模型锚定在用户头部上方?

如何使用Swift宏和@Observable和@Environment?

为什么无法在 Swift 中使用AVFoundation扫描 QRCode

SwiftUI 从任务中安全更新状态变量

如何在 SceneKit 上制作毛玻璃效果

Swift - 订阅视图之外的绑定值

如何更改 Picker 的边框 colored颜色

使 Swift 并发中的任务串行运行

如何以快速 Select 器菜单样式调整图像大小

如何获取 NSRunningApplication 的参数?

判断 Swift 程序是否正在输出到终端

Swift 3.0 的 stringByReplacingOccurencesOfString()

如何从一个可观察的数组创建一个可观察的数组?

强制打开已在同一行代码中 Select 性访问的变量是否安全?

使用 swift IOS 使 UIBarButtonItem 消失