当 SwiftUI 视图具有复杂逻辑时,我喜欢使用枚举来表示它的状态(通常在视图模型/服务中)。
struct FooView {
enum ProgressState {
case idle
case loading
case completed(Model)
case error
var stateName: String { ... }
}
@State var state: ProgressState = .idle
...
问题:
我想要的是一种将可绑定对象连接到特定枚举案例的方法或方法。在此示例中,要显示警报(或表格),因为像
<<$state.error>>
这样的东西显然是不可能的。
...
var body: some View {
Text(state.stateName)
// show alert on error
.alert("oops there was an error",
isPresented: <<$state.error>>)
{ //1.
...
}
}
}
当前替代方案
最简单的解决方案是使用额外的变量,但我真的不喜欢手动保持它们同步。
更好的解决方案?
我正在探索使用组合来更新附加变量
state
var 更改,问题始终是可绑定对象也需要更改其状态。
那么也许有一个枚举协议以及警报和工作表扩展来处理这些而不是 Bindable ?有没有人尝试过类似的方法或知道更好的方法?
谢谢你
您可以将状态连接到绑定:
var body: some View {
let shouldShowError = Binding<Bool> {
state == .error
} set: { _ in
guard state == .error else { return }
state = .idle
}
Button(state.stateName) { state = .error }
.alert("oops there was an error", isPresented: shouldShowError)
{ }
}