这是一段对我有用的代码..。
VStack(spacing: pad/2) {
getRgbColor(i:0)
.onTapGesture { editColor(i:0) }
.frame(width: pad, height: pad)
.border(.black.opacity(0.5), width: 1)
getRgbColor(i:1)
.onTapGesture { editColor(i:1) }
.frame(width: pad, height: pad)
.border(.black.opacity(0.5), width: 1)
getRgbColor(i:2)
.onTapGesture { editColor(i:2) }
.frame(width: pad, height: pad)
.border(.black.opacity(0.5), width: 1)
}原版有更多的条目。它起作用了,但你可以看到它是如何重复的。我可能想做一个6x4的补丁,看起来像一个麦克白目标,所以我想知道是否有更好的方法,不重复这么多。我试着把电话转到getRgbColor()电话里。
func getRgbColor(i:Int) -> SwiftUI.Color {
return SwiftUI.Color(red: R + rgbDel[i][0] * step,
green: G + rgbDel[i][1] * step,
blue: B + rgbDel[i][2] * step)
.onTapGesture { editColor(i:0) }
.frame(width: pad, height: pad)
.border(.black.opacity(0.5), width: 1) as! Color
}这是编译的,但当我运行它时给出了一个SIGABRT .
不能将'SwiftUI.ModifiedContent>>,SwiftUI._FrameLayout>、SwiftUI._OverlayModifier,SwiftUI.Color>>>‘(0x109735e90)转换为“SwiftUI.Color”(0x1ec3b9eb8)。2022-10-01 'SwiftUI.ModifiedContent>>,SwiftUI._FrameLayout>,SwiftUI._OverlayModifier,SwiftUI.Color>>> (0x109735e90)到SwiftUI.Color (0x1ec3b9eb8)的值为493288。
有好的解决办法吗?
是的有。我没想到调用修饰符会改变底层类型,因为我编写的大部分内容都是在cpp中编写的,在cpp中,这是不可想象的。在第一个注释之后,我编写并重新命名了getRgbColor()函数.
func rgbButton(i:Int) -> some View {
return SwiftUI.Color(red: R + rgbDel[i][0] * step,
green: G + rgbDel[i][1] * step,
blue: B + rgbDel[i][2] * step)
.onTapGesture { editColor(i:i) }
.frame(width: pad, height: pad)
}发布于 2022-10-01 13:41:34
SwiftUI中的修饰符实际上并不修改视图。相反,它们创建一个新视图(例如,ModifiedContent),其属性已更改/应用。
每当我们将修饰符应用于SwiftUI视图时,我们实际上创建了一个新视图,并应用了该更改--我们不只是修改现有的视图。
因此,当您向Color添加所有修饰符时,您将使其成为不同类型的视图。这就是为什么as! Color失败的原因。
要解决这个问题,您可以为rgb颜色创建一个视图。
struct RgbColor: View {
let i: Int
// Add any other info the view needs as constants
var body: some View {
// ...
}
}使用它:
RgbColor(i: 1, /* other parameters */)我希望这能帮到你!
https://stackoverflow.com/questions/73918121
复制相似问题