将颜色选择器选择传递到SwiftUI中的其他视图

将颜色选择器选择传递到SwiftUI中的其他视图,swiftui,Swiftui,我想我已经很接近了,但也缺少了一些关于SwiftUI和传递数据的基本信息 我有一个名为“masterColor”的顶级颜色变量,我将它放在“DataModel”结构中 然后在我的视图“NightLight”中,我有一个系统“ColorPicker”,在这里我使用本地变量“localColor”来反映ColorPicker具有的任何值 最后,我有一个“BackgroundControllerView”,它设置了一个背景色(我想阅读dataModel.masterColor) 我要做的是将dataM

我想我已经很接近了,但也缺少了一些关于SwiftUI和传递数据的基本信息

  • 我有一个名为“masterColor”的顶级颜色变量,我将它放在“DataModel”结构中
  • 然后在我的视图“NightLight”中,我有一个系统“ColorPicker”,在这里我使用本地变量“localColor”来反映ColorPicker具有的任何值
  • 最后,我有一个“BackgroundControllerView”,它设置了一个背景色(我想阅读dataModel.masterColor)
  • 我要做的是将dataModel.masterColor(我的整个应用程序都可以看到)设置为localColor(只有夜光灯才能看到)。我在这里简化了结构,但问题的重点是如何获取本地数据,并将其设置为全局数据,以便应用程序的其余部分看到

    struct DataModel {
        @State var masterColor = Color.red
    }
    
    struct NightLight: View {
        @Binding var dataModel: DataModel
        @State var localColor = Color.blue
        
        var body: some View {
            ColorPicker("Pick Color", selection: $localColor)
            // Question: somehow set dataModel.masterColor = localColor ??
        }
    
    }
    
    struct BackgroundControllerView: View {
        @Binding var dataModel: DataModel
        
        var body: some View {
            Rectangle()
                .fill(dataModel.masterColor)
        }
    }
    

    非常感谢任何帮助

    不需要单独的
    localColor
    。您可以直接将
    $dataModel.masterColor
    传递给选择器

    struct NightLight: View {
        @Binding var dataModel: DataModel /// no need for extra `localColor`
        
        var body: some View {
            ColorPicker("Pick Color", selection: $dataModel.masterColor)
        }
    }
    
    另外,从
    masterColor
    中删除
    @State
    ——您希望
    @State
    应用于
    数据模型,而不是内部的属性

    struct DataModel {
        var masterColor = Color.red /// no @State here
    }
    
    struct NightLight: View {
        @Binding var dataModel: DataModel
        
        var body: some View {
            ColorPicker("Pick Color", selection: $dataModel.masterColor)
        }
    }
    
    struct BackgroundControllerView: View {
        @Binding var dataModel: DataModel
        
        var body: some View {
            Rectangle()
                .fill(dataModel.masterColor)
        }
    }
    
    struct ContentView: View {
        @State var dataModel = DataModel() /// use `@State` here instead
        
        var body: some View {
            VStack {
                NightLight(dataModel: $dataModel)
                BackgroundControllerView(dataModel: $dataModel)
            }
        }
    }
    
    结果: