有没有更好的方法来做到这一点?有没有办法访问环境中的 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")")
}
}
最佳答案
通过在不同 View 中使用 @AppStorage
,您仍然可以访问相同的 UserDefaults.standard
存储(除非您明确指定 suiteName
)。
这意味着您可以直接在 subview 中使用 @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
枚举),因此您不会在每个 View 中重复 false
。
或者,您可以将 @AppStorage
直接注入(inject) environment
。见:
关于swiftui - 如何从 SwiftUI 2.0 中的多个其他 View 访问和编辑 @AppStorage 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64117138/