微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI:绑定到@AppStorage

如何解决SwiftUI:绑定到@AppStorage

在以下示例中,如何根据 SwiftUI 更新 activeSheetaArrived 的方式更改 bArrived 的值?

struct ContentView: View {

    @AppStorage("didAArrive") var aArrived: Bool = false
    @AppStorage("didBArrive") var bArrived: Bool = false

    enum ActiveSheet: Identifiable {
        case aArrived,bArrived

        var id: Int {
            hashValue
        }
    }

    @State private var activeSheet: ActiveSheet?

    var body: some View {
        Text("Hello")
            .sheet(
                item: $activeSheet,content: { item in
                    switch item {
                    case .aArrived:
                        Text("A arrived")
                    case .bArrived:
                        Text("B arrived")
                    }
                }
            )
    }
}

解决方法

您可以为工作表创建自定义装订,根据 aArrivedbArrived 获取其值。绑定值将根据 aArrivedbArrived 进行初始化,并在每次更改时更新。

struct ContentView: View {

    @AppStorage("didAArrive") var aArrived: Bool = false
    @AppStorage("didBArrive") var bArrived: Bool = false

    enum ActiveSheet: Identifiable {
        case aArrived,bArrived

        var id: Int {
            hashValue
        }
    }

    var body: some View {
        let sheetBinding = Binding<ActiveSheet?>(
            get: {
                if aArrived && bArrived {
                    return ActiveSheet.aArrived
                } else if aArrived {
                    return ActiveSheet.aArrived
                } else if bArrived {
                    return ActiveSheet.bArrived
                } else {
                    return nil
                }
            },set: { _ in }
        )
        VStack(spacing: 20) {
            Toggle("A arrived",isOn: $aArrived)
            Toggle("B arrived",isOn: $bArrived)
        }
        .sheet(
            item: sheetBinding,content: { item in
                switch item {
                case .aArrived:
                    Text("A arrived")
                case .bArrived:
                    Text("B arrived")
                }
            }
        )
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。