首页 > 解决方案 > 如何从 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")")
    }
}

标签: swiftui

解决方案


通过@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. 看:


推荐阅读