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

您如何访问&;在SwiftUI 2.0中从多个其他视图编辑@AppStorage变量?,swiftui,Swiftui,有更好的方法吗?有没有办法访问环境中的UserDefaults??我做了以下工作: struct ContentView: View { @AppStorage("darkMode") var darkMode = false var body: some View { SubView(darkMode: $darkMode) } } } struct SubView: View { @Binding

有更好的方法吗?有没有办法访问环境中的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
enum),因此您不会在每个视图中重复
false


或者,您可以将
@AppStorage
直接注入
环境
。见:


通过在不同的视图中使用
@AppStorage
,您仍然可以访问相同的
用户默认值.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
enum),因此您不会在每个视图中重复
false


或者,您可以将
@AppStorage
直接注入
环境
。见:


对于这个例子,我将如何在contentview中使用darkMode var?比方说,如果我想检查设置是什么,这样我就可以在黑暗模式中创建整个子视图了?或者整个应用程序处于黑暗模式?比如,如果我有一个控制暗模式的设置页面,我将如何使用那里的AppStorage,然后在App struct中读取它,以便我可以更改整个应用程序的首选配色方案?1)我相信你只问了如何从子视图访问@AppStorage var,所以我回答了上面的问题。2) 如何在contentview中使用darkMode变量只需添加
@AppStorage
。3) 更改整个应用程序的首选配色方案-这与此问题没有直接关系,但在您的根视图中,您可以将
@AppStorage
darkMode变量传递到
.environment(\.colorScheme,darkMode)
并将其应用到根视图。好的,很抱歉,让我编辑此问题以使其更清楚。但是,从您的评论来看:我会将AppStorage保留在settings视图和root视图中吗?因为我试过了,它不允许您在设置页面(不会与根视图中的var链接)中,在不声明var值的情况下编写AppStorage var。我在这里谈论的是单一真实来源,我们需要为AppStorage变量建立单一真实来源,对吗?如果您从不同的视图访问
AppStorage
,您仍然可以访问相同的UserDefaults.standard存储(除非您指定suiteName)。这意味着您可以轻松地在任何视图中使用相同的
AppStorage
。真的吗?我试图在另一个视图中使用'darkMode'键访问AppStorage,但它给出了一个错误:不明确地使用'init(\:store:)'。当然,如果我用Bool值设置AppStorage var=false,那么它就没有问题,但是我想访问根视图中设置的根AppStorage var,这样我就可以读取它的值。因此,对于这个例子,我应该如何在contentview中使用darkMode var?比方说,如果我想检查设置是什么,这样我就可以在黑暗模式中创建整个子视图了?或者整个应用程序处于黑暗模式?比如,如果我有一个控制暗模式的设置页面,我将如何使用那里的AppStorage,然后在App struct中读取它,以便我可以更改整个应用程序的首选配色方案?1)我相信你只问了如何从子视图访问@AppStorage var,所以我回答了上面的问题。2) 如何在contentview中使用darkMode变量只需添加
@AppStorage
。3) 更改整个应用程序的首选配色方案-这与此问题没有直接关系,但在您的根视图中,您可以将
@AppStorage
darkMode变量传递到
.environment(\.colorScheme,darkMode)
并将其应用到根视图。好的,很抱歉,让我编辑此问题以使其更清楚。但是,从您的评论来看:我会将AppStorage保留在settings视图和root视图中吗?因为我试过了,它不允许您在设置页面(不会与根视图中的var链接)中,在不声明var值的情况下编写AppStorage var。我在这里谈论的是单一真实来源,我们需要为AppStorage变量建立单一真实来源,对吗?如果您从不同的视图访问
AppStorage
,您仍然可以访问相同的UserDefaults.standard存储(除非您指定suiteName)。这意味着您可以轻松地在任何视图中使用相同的
AppStorage
。真的吗?我试图在另一个视图中使用'darkMode'键访问AppStorage,但它给出了一个错误:不明确地使用'init(\:store:)'。当然,如果我使用Bool值设置AppStorage var=false,那么它就没有问题,但是我想访问根视图中设置的根AppStorage var,以便读取它的值。。