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")
                }
            }
        )
    }
}