繁体   English   中英

SwiftUI State 变量变化后视图没有变化

[英]SwiftUI view does not change after State variable changes

我是 Swift 的新手,我遇到了一个问题,当 state 变量发生变化时,UI 不会发生变化。

我的 ContentView.swift:

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
}

我已经研究相关问题: 1、2

但是,我无法更改视图。

您以错误的方式使用 ViewModel 的属性包装器。

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 概念进行更多研究,例如此处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM