如果我有这个代码:
@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
3
和1
2
3
4
5
之间切换,但它只显示1
2
3
。我该怎么解决这个问题?
如果项的数量不变,则您使用的ForEach
的形式是可以的,但如果视图可能发生更改,则您需要提供符合协议Identifiable
的项,或者使用提供id:
:的ForEach
的形式
ForEach(1..<self.n+1, id: .self) { i in
Text(String(i))
}
传递为id
的值是一个KeyPath
,它告诉SwiftUI将项目的哪个属性用作其标识符。在Int
的情况下,您可以只使用Int
的值,该值可以通过.self
属性访问。
SwiftUI使用标识符来知道ForEach
中的项目何时被添加或删除,因此它需要它们才能看到更改。