首页 > 解决方案 > swift - 带状态的 ForEach 循环

问题描述

如果我有这个代码:

@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 5但它只显示1 2 3. 我将如何解决这个问题?

标签: swiftforeachswiftuistate

解决方案


如果项目的数量是恒定的,那么您使用的形式ForEach很好,但是如果视图可能会改变,那么您需要提供符合协议的项目Identifiable,或者使用ForEach提供的形式id:

ForEach(1..<self.n+1, id: \.self) { i in
    Text(String(i))
}

传递的值idKeyPath告诉 SwiftUI 使用项目的哪个属性作为其标识符的值。在 的情况下Int,您可以只使用Int可以通过.self属性访问的 ' 值。

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


推荐阅读