swift - 基于外部单例类中的属性的 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
.
任何帮助,将不胜感激。
解决方案
我相信这就像修改您的工作表代码一样简单:
.sheet(isPresented: !$authenticator.isSignedIn) {
AuthenticationView()
}
推荐阅读
- javascript - 谁能用javascript解释下面的代码逻辑?
- angular - “ERR_EMPTY_RESPONSE”仅在我的浏览器中(Docker)
- python - 我可以在 python 中使用子函数的 continue 语句吗?
- c# - 如何在 .netcore 中使用 Process.Start()
- javascript - 没有匹配项时显示消息(Js / Ajax)
- amazon-web-services - AWS:无法删除客户端证书。证书 ID 'XXXXX',在 stage prod 中被引用
- button - 如何在按下其中一个按钮时禁用其他按钮并通过按下另一个按钮来重置
- python - 如何使用请求下载文件
- angular - 将ngFor与div一起使用以显示具有不同列数的表格时如何使用文本框添加新行或列
- python - hashcat 使用函数作为输入