更改未反映在SwiftUI中的foreach中

时间:2020-05-16 04:10:52

标签: swiftui

我尝试了以下视图。我希望当我点击更新按钮时,矩形的颜色会改变。但是什么也没发生。为什么会发生这种事情?

struct SwiftUIView: View {
    @State var index: Int = 0

    var colors = [Color.red, Color.blue, Color.orange, Color.green]

    var body: some View {
        NavigationView {
            VStack {
                ForEach(0..<colors.count) { i in
                    if i == self.index {
                        Rectangle()
                            .fill(self.colors[i])
                            .frame(width: 100, height: 100)
                    }
                }
            }
            .navigationBarTitle("title")
            .navigationBarItems(trailing: Button(action: {
                self.index += 1
            }) {
                Text("Update")
            })
        }

    }
}

1 个答案:

答案 0 :(得分:0)

更改索引值不会影响任何视图,因此不会重绘。删除ForEach并像这样简单显示Rectangle

struct SwiftUIView: View {
    @State var index: Int = 0

    var colors = [Color.red, Color.blue, Color.orange, Color.green]

    var body: some View {
        NavigationView {
            VStack {
                Rectangle()
                    .fill(self.colors[index])
                    .frame(width: 100, height: 100)           
            }
            .navigationBarTitle("title")
            .navigationBarItems(trailing: Button(action: {
                self.index += 1
            }) {
                Text("Update")
            })
         }
    }
}

现在,当索引更改时,Rectangle必须重绘,因为它的填充颜色直接取决于索引的值。