swiftui - 如何从 SwiftUI 2.0 中的多个其他视图访问和编辑 @AppStorage 变量?
问题描述
有一个更好的方法吗?有没有办法访问环境中的 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")")
}
}
解决方案
通过@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
. 看:
推荐阅读
- java - 如何修复重复的快速排序算法
- javascript - 创建一个 codemod 以向数组添加一个新元素
- spotfire - 如何在 Spotfire 中冻结交叉表中的列
- javascript - 使用 react 和 axios 向 nodejs api 发送 post 请求时输入 undefined
- python - 如何使用 pip3 安装 psycopg2?
- c++ - 如何从 std::map 中的 std::pair 的 std::vector 获取输入?
- javascript - 扩展中每个 Chrome 选项卡的唯一会话
- java - 我的 Mandelbrot 集不生成。我的方程式有什么问题?
- javascript - 如何使用 fetch API 发布多个文件?
- javascript - 角度 8 条路径