swift - 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
3
,1
2
3
4
5
但它只显示1
2
3
. 我将如何解决这个问题?
解决方案
如果项目的数量是恒定的,那么您使用的形式ForEach
很好,但是如果视图可能会改变,那么您需要提供符合协议的项目Identifiable
,或者使用ForEach
提供的形式id:
:
ForEach(1..<self.n+1, id: \.self) { i in
Text(String(i))
}
传递的值id
是KeyPath
告诉 SwiftUI 使用项目的哪个属性作为其标识符的值。在 的情况下Int
,您可以只使用Int
可以通过.self
属性访问的 ' 值。
SwiftUI 使用标识符来知道何时ForEach
添加或删除了中的项目,因此它需要它们才能让您能够看到更改。
推荐阅读
- google-apps-script - 如何阅读 gmail 邮件内容并仅搜索链接,然后将其保存在某处
- javascript - 要求 Joi 中的有效字符串必须在其他属性的数组中
- php - PHP - 循环 CSV 文件并检查空行
- java - 如何访问和播放 Java 资源类文件夹中的音频文件?
- macos - 获取在 I/O Kit 中发出设备请求的进程的 PID
- javascript - 从posenet提取关键点到json文件?
- c# - 如何修复我的“控制器”,使我的对象不会变为空
- scala - 如何最好地将 SparkSQL Dataframe Array[String] 列转换为新的 [String] 列
- linux - ASPNETCORE 容器在 linux 服务器上加载,但“图像操作系统“windows”无法在此平台上使用”
- php - ajax 在第一次单击时不起作用,在 2 次单击后运行多次