swift 更改@State变量时,不会更新Picker的色调颜色

ymdaylpp  于 2023-05-16  发布在  Swift
关注(0)|答案(1)|浏览(145)

当我有一个SwiftUIPicker,它的颜色基于一个@State变量(Color)时,当状态变量改变时,选择器的文本颜色不会更新。
下面是一个例子:

struct TestView: View {
    @State var selColor: Color = .red
    @State var selectedNumber: Int = 10

    var body: some View {
        VStack {
            Spacer()
            Text("Test String That changes color")
                .foregroundColor(selColor) // <-- works as expected
            Picker("Selected", selection: $selectedNumber) {
                ForEach([2, 4, 6, 8, 10], id: \.self) {
                    Text(String($0))
                }
            }
            .onChange(of: selectedNumber) { newValue in
                selColor = [Color.red, Color.blue, Color.green, Color.yellow, Color.blue, Color.brown][Int.random(in: 0..<5)]
            }
            .tint(selColor) // <-- sets the color upon initialisation but doesn't update afterward
            Spacer()
        }
    }

每当我改变选择器的值时,文本颜色会改变,但选择器的颜色不会改变。在下面的示例屏幕截图中,文本的颜色已更改为蓝色,但选择器仍为红色。

知道我哪里做错了吗

vlurs2pr

vlurs2pr1#

我已经弄明白了,虽然仍然不确定为什么.tint(_ Color)修饰符不起作用,所以我有点担心这个解决方案是一个解决方案-但它确实有效。技巧是将色调设置为.white,然后将所需的颜色状态变量与.colorMultiply(_ Color)修改器连接,而不是.tint(_ Color)
相关代码:

VStack {
            Spacer()
            Text("Test String That changes color")
                .foregroundColor(selColor)
            Picker("Selected", selection: $selectedNumber) {
                ForEach([2, 4, 6, 8, 10], id: \.self) {
                    Text(String($0))
                }
            }
            .onChange(of: selectedNumber) { newValue in
                selColor = [Color.red, Color.blue, Color.green, Color.yellow, Color.blue, Color.brown][Int.random(in: 0..<5)]
            }
            .tint(.white)            // <-- Set the base color to .white
            .colorMultiply(selColor) // <-- Here is the trick
            Spacer()

相关问题