【发布时间】:2022-01-06 14:51:39
【问题描述】:
以下代码成功显示了一组颜色,并在点击颜色时显示选定的颜色,类似于标准的ColorPicker。我想做的是在其他视图中使用此自定义颜色选择器,其方式与标准 ColorPicker 类似。我的问题是我无法将所选颜色公开给其他视图。
内容视图:
struct ContentView: View {
var body: some View {
VStack{
CustomColorPicker()
}
}
}
自定义颜色选择器:
struct CustomColorPicker: View {
var colors: [UIColor] = [.red, .green, .blue, .purple, .orange]
@State var selectedColor = UIColor.systemGray6
var body: some View {
VStack {
Rectangle()
.fill(Color(selectedColor))
.frame(width: 45, height: 45)
HStack(spacing: 0) {
ForEach(colors, id: \.self) { color in
Button {
selectedColor = color
} label: {
Color(color)
.border(Color.gray, width: color == selectedColor ? 2 : 0)
}
}
}
.frame(height: 50.0)
}
}
}
我已使用model/ObservableObject 绑定,以便能够在其他视图中捕获选定的颜色,但当您选择颜色时它不会。
当点击颜色选择器中的颜色时,如何使ContentView 中的Rectangle 更新其填充颜色?
或者一般来说,创建可重复使用的自定义颜色选择器的最佳方法是什么?
使用 ObservableObject
内容视图
struct ContentView: View {
@ObservedObject var cModel = ColorPickerModel()
var body: some View {
VStack{
CustomColorPicker()
Rectangle()
.fill(cModel.selectedColor)
.frame(width: 100, height: 100)
}
}
}
自定义颜色选择器
class ColorPickerModel:ObservableObject{
@Published var selectedColor:Color = Color.orange
}
struct CustomColorPicker: View {
var colors: [UIColor] = [.red, .green, .blue, .purple, .orange]
@StateObject var cModel = ColorPickerModel()
var body: some View {
VStack {
Rectangle()
.fill(cModel.selectedColor)
.frame(width: 45, height: 45)
HStack(spacing: 0) {
ForEach(colors, id: \.self) { color in
Button {
cModel.selectedColor = Color(color)
} label: {
Color(color)
//.border(Color.gray, width: color == selectedColor ? 2 : 0)
}
}
}
.frame(height: 50.0)
}
}
}
【问题讨论】:
-
在你的第一个例子中。使状态成为可重用的绑定。然后像存储其他任何内容一样存储该值,以便您可以在任何地方访问它。
-
@loremipsum - 您介意在
@Binding上详细说明吗?抱歉,我一般对@Binding或 SwiftUI 没有太多经验。谢谢
标签: swiftui color-picker observableobject