首页 > 解决方案 > 基于外部单例类中的属性的 SwiftUI 显示表

问题描述

我陷入了 swiftui 并试图显示基于外部类中的属性的工作表。我希望根据此属性更新视图。据我了解,我需要使用带有 @Published 属性的 ObservableObject 。但是,我似乎无法让我的视图“观察”有问题的属性。我试过使用@ObservedObject、@State 和@EnvironmentObject。但这一切都会导致如下错误:

Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'

.sheet视图类中以下行的此错误

我的外部课程如下所示:

class Authenticator: ObservableObject {
    @Published var isSignedIn: Bool = false
    
    static let shared = Authenticator()

     init() {
    handle = Auth.auth().addStateDidChangeListener({[weak self] auth, user in
        if user != nil {
            self?.isSignedIn = true
            
        } else {
            self?.isSignedIn = false
   
        }
    })
}

    func signIn(email:String, password:String) {
          //signin
          isSignedIn = true;
    }

}

//查看代码

struct AccountView: View {
    
    @ObservedObject var authenticator:Authenticator = Authenticator.shared
    var body: some View {
        NavigationView {
            ZStack {
                Color.white.edgesIgnoringSafeArea(.all).frame(maxWidth:.infinity, maxHeight: .infinity)
           
                if Authenticator.shared.isSignedIn {
                    Button {
                        //sign out here which then updates isSignedIn property
                        Authenticator.shared.signout() 
                    } label: {
                        Text("Sign out")
                    }

                }

            }.sheet(isPresented: !authenticator.isSignedIn) {
                
            } content: {
                AuthenticationView()
            }
          
        }

    }
}

我不确定是否因为我的 ObservableObject 是单例而出现问题?我的代码将登录,然后如果我重新启动应用程序,则会观察到登录状态。当时它似乎没有更新我的用户界面。

我的 Authenticator 是一个单例,因为我正在使用 Firebase Auth 并尝试观察身份验证状态的变化。但我不知道这是否是错误的方法,以及是否应该在我的实例中实例化我的身份验证器实例App并将其作为@EnvironmentObject.

任何帮助,将不胜感激。

标签: swiftswiftui

解决方案


我相信这就像修改您的工作表代码一样简单:

.sheet(isPresented: !$authenticator.isSignedIn) {
    AuthenticationView()
}

推荐阅读