swiftui - 如何从 SwiftUI 2.0 中的多个其他 View 访问和编辑 @AppStorage 变量?

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

最佳答案

通过在不同 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/

相关文章:

ios - SwiftUI - 状态栏文本下方的列表滚动

swiftui - SwiftUI中的ForEach问题

SwiftUI 使用本地化为句子中的一个单词添加颜色

swift - 如何在 SwiftUI 中使用 Picker 设置文本字段作为输入

ios - SwiftUI 在多平台中获取屏幕大小

swift - 如何制作通用的 UIViewRepresentable 结构?

ios - 通过函数使用Gesture时类型 'any View'不能符合 'View'

macos - 使用 SwiftUI 在 macOS 中设置 SidebarView 的宽度

swiftui - 如何在不使用部分的情况下创建具有分隔成员的 SwiftUI 列表

SwiftUI Widget DateStyle 自定义格式