迅速-状态的ForEach循环

时间:2020-07-29 01:00:32

标签: swift foreach swiftui state

如果我有此代码:

@State var n = 3
var body: some View {
    VStack {
        Button(action:{
            if self.n == 3 {
                self.n = 5
            } else {
                self.n = 3
            }
        }) {
            Text("Click me")
        }
        ForEach(1..<self.n+1) { i in
            Text(String(i))
        }
    }
}

我希望这段代码在1 2 31 2 3 4 {{1} }在您点击按钮时在屏幕上显示,但是仅显示5 1 2。我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果项目数恒定,则您使用的ForEach形式是可以的,但是如果视图可能更改,则您需要提供符合协议Identifiable的项目,或使用提供ForEach的{​​{1}}形式:

id:

作为ForEach(1..<self.n+1, id: \.self) { i in Text(String(i)) } 传递的值是id,它告诉SwiftUI该项目的哪个属性用作其标识符。对于KeyPath,您可以仅使用Int的值,该值可以通过Int属性进行访问。

SwiftUI使用标识符来知道何时添加或删除.self中的项目,因此需要它们才能使您看到更改。