如何在SwiftUI 2.0中从多个其他视图访问和编辑@AppStorage变量?

时间:2020-09-29 09:51:42

标签: swiftui

有更好的方法吗?有没有办法在环境中访问UserDefaults?我做了以下事情:

struct ContentView: View {
    @AppStorage("darkMode") var darkMode = false

    var body: some View {
            SubView(darkMode: $darkMode)
        }
    }
}

struct SubView: View {
    @Binding var darkMode: Bool
    var body: some View {
        Text("Dark Mode is \(darkMode == true ? "on" : "off")")
    }
}

1 个答案:

答案 0 :(得分:2)

通过在不同的视图中使用@AppStorage,您仍然可以访问相同的UserDefaults.standard存储(除非您明确指定suiteName)。

这意味着您可以直接在子视图中使用@AppStorage

struct ContentView: View {
    @AppStorage("darkMode") var darkMode = DefaultSettings.darkMode

    var body: some View {
        VStack {
            Button("Toggle dark mode") {
                self.darkMode.toggle()
            }
            SubView()
        }
        .colorScheme(darkMode ? .dark : .light)
        .preferredColorScheme(darkMode ? .dark : .light)
    }
}

struct SubView: View {
    @AppStorage("darkMode") var darkMode = DefaultSettings.darkMode

    var body: some View {
        Text("Dark Mode is \(darkMode == true ? "on" : "off")")
    }
}

enum DefaultSettings {
    static let darkMode = false
}

请注意:默认的darkMode值已提取(提取到DefaultSettings枚举中),因此您不必在每个视图中都重复false


或者,您可以将@AppStorage直接注入environment中。参见: