【发布时间】:2020-05-07 06:43:06
【问题描述】:
我尝试制作一个具有自定义初始化功能的颜色选择器来设置原始颜色。以及 3 个状态变量(色调、饱和度、亮度)来保存将由较小组件更改的值。在尝试了很多方法之后,我仍然无法在自定义初始化函数中更改 3 个 @State 变量的值。好诡异。谁能帮我?谢谢
struct ColorPicker: View {
@State var saturation: CGFloat = 0.5
@State var brightness: CGFloat = 0.5
@State var hue: CGFloat = 0.5
@State var alpha: CGFloat = 1
var oriColor : UIColor? = nil
var oriHue: CGFloat = 0
var oriSaturation: CGFloat = 0
var oriBrightness: CGFloat = 0
init(oriColor:UIColor?) {
self.oriColor = oriColor
if let color = oriColor{
color.getHue(&oriHue, saturation: &oriSaturation, brightness: &oriBrightness, alpha: &alpha)
self._hue = State(initialValue:oriHue)
self._saturation = State(initialValue:oriSaturation)
self._brightness = State(initialValue:oriBrightness)
self.hue = oriHue
debugPrint("set value:\(hue)")
}
}
var body: some View {
debugPrint("make view with:\(self.hue)")
let bindingSaturation = Binding<CGFloat>(get: {return self.saturation}, set: {val in self.saturation = val})
let bindingBrightness = Binding<CGFloat>(get: {return self.brightness}, set: {val in self.brightness = val})
let bindingHue = Binding<CGFloat>(get: {return self.hue}, set: {val in self.hue = val})
debugPrint("make view with:\(self.hue)")
return Text("debugging")
}
}
Click here to view code and output
--- 更新应用 Procrastin8 的答案
我按照你的建议修改了代码
struct ColorPicker: View {
@State var hue: CGFloat
var oriHue: CGFloat = 0.5
var oriSaturation: CGFloat = 0.5
var oriBrightness: CGFloat = 0.5
var oriAlpha: CGFloat = 1
init(oriColor:UIColor?) {
if let color = oriColor {
color.getHue(&oriHue, saturation: &oriSaturation, brightness: &oriBrightness, alpha: &oriAlpha)
self.hue = oriHue
}
else {
self._hue = State(initialValue:oriHue)
}
}
var body: some View {
debugPrint("make view with:\(self.hue)")
return VStack {
BrightnessGrid.init(hue: self.$hue)
}
}
}
struct BrightnessGrid : View {
@Binding var hue: CGFloat
var body: some View {
VStack{
Text("hue:\(self.hue)")
}
}
}
但在所有存储的属性初始化之前出现“'self' used”错误,如附件图片here中所示
我来宾的原因是当我们有自定义初始化时,默认初始化器将不起作用,那么我们必须手动设置 @State 变量的值。然后又回到第一种情况。
现在的init函数是
init(oriColor:UIColor?) {
if let color = oriColor {
color.getHue(&oriHue, saturation: &oriSaturation, brightness: &oriBrightness, alpha: &oriAlpha)
}
self._hue = State(initialValue:oriHue)
}
还是不行。
--- 更新 2 我制作了一个新的测试项目并应用了 User3441734 的答案。在主视图中应用时,它工作得很好。然后我像这样分开模块。
import SwiftUI
struct ContentView: View {
var colorA: UIColor = UIColor.orange
var colorB: UIColor = UIColor.blue
@State var oriColor: UIColor? = nil
func changeToColorA(){
oriColor = colorA
}
func changeToColorB(){
oriColor = colorB
}
var body: some View {
VStack{
HStack{
Button(action:changeToColorA){
Text("Color A")
}
Button(action:changeToColorB){
Text("Color B")
}
}
TestView(oriColor: oriColor)
}
}
}
struct TestView: View {
@State var hue: CGFloat
var oriHue: CGFloat = 0.5
var oriSaturation: CGFloat = 0.5
var oriBrightness: CGFloat = 0.5
var oriAlpha: CGFloat = 1
init(oriColor:UIColor?) {
if let color = oriColor {
color.getHue(&oriHue, saturation: &oriSaturation, brightness: &oriBrightness, alpha: &oriAlpha)
}
_hue = State(initialValue: oriHue)
}
var body: some View {
debugPrint("make view with:\(self.hue)")
return VStack {
Text("\(hue)").background(Color(hue: Double(hue), saturation: Double(oriSaturation), brightness: Double(oriBrightness), opacity: Double(oriAlpha)))
.onTapGesture {
self.hue = 0.22
}
Slider(value: $hue, in: 0 ... 1) {
Text("HUE")
}
}
}
}
然后单击颜色 A、颜色 B 按钮时没有任何反应。我做错了什么吗?
【问题讨论】:
-
如果您在此处复制可重现和可复制的代码,而不是泄露 BrightnessGrid 和 HueSlider 的代码,这对我们想要提供帮助的人来说会容易得多。或者以这种方式更改/简化您的代码,如果您不想在这里显示您的代码,我们可以复制并运行它...