[英]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
}
但是,我无法更改视图。
您以错误的方式使用 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.