SwiftUI 绑定到特定的枚举案例

问题描述 投票:0回答:1

当 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 ?有没有人尝试过类似的方法或知道更好的方法?

谢谢你

swift swiftui enums combine
1个回答
0
投票

您可以将状态连接到绑定:

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)
    { }
}
© www.soinside.com 2019 - 2024. All rights reserved.