假设一个单例类具有有关登录状态的枚举,如下所示:
@Published var loginState: LoginState = .unknown
单例类实例在视图中被指定为
@ObservedObject
,以获取其他 @Published
变量的更改,如下所示:
struct LoginView: View {
@ObservedObject var loginDelegate = Singleton.shared
当单例
loginState
设置为特定枚举情况(例如 .error
)时,如何使用类似以下内容在视图中触发警报?
}.alert(isPresented: <something> ) { ... }
尝试以下方法
}.alert(isPresented: .constant(loginDelegate.loginState == .error)) { ... }
但是您需要在警报关闭按钮操作中将
loginDelegate.loginState
重置回 .unknown
,否则警报可能会立即重新出现。
实现此目的的最佳方法是使用自定义绑定。为什么它比将枚举包装在常量中更好?因为当警报解除时会调用绑定设置。
更新 setter 中的状态枚举,以后由于忘记更新每个回调中的状态而引入错误的可能性会较小
public var body: some View {
let alertIsPresentedBinding = Binding<Bool>(
get: {
switch self.viewModel.state {
case .error:
return true
default:
return false
}
},
set: {
if $0 == false {
self.viewModel.state = .idle
}
}
)
Stack {
...
}
.alert("Title", isPresented: alertIsPresentedBinding, actions: {})
}