我的问题是:我有一些物品的简单阵列。我想使用List
和ForEach
来显示带有这些项目的.indices()
。
(这是因为我的实际问题是在Toggle
中使用List
处理的,并且对于isOn
绑定,我需要索引来解决绑定到EnvironmentObject
的模型。)因此,遍历数组items
的解决方案无法解决我的问题。
简化的起点如下:
struct ContentView: View {
@State var items = ["Item1", "Item2", "Item3"]
var body: some View {
List {
ForEach(items.indices) {index in
Text(self.items[index])
}.onDelete(perform: deleteItem)
}
}
func deleteItem(indexSet: IndexSet) {
self.items.remove(atOffsets: indexSet)
}
}
如果我现在尝试滑动删除一行,则会收到以下错误消息:
Thread 1: Fatal error: Index out of range
调试闭包内部的index
值,我发现items
数组的索引不会更新。例如:如果我用"Item 1"
删除第一行并在删除行后检查index
的值,它将返回2
而不是0
(这是预期的第一个索引)数组)。为什么会这样,我该如何解决呢?
感谢您的帮助!
答案 0 :(得分:3)
只需使用动态内容ForEach
构造函数(_ data: .., id: ...)
ForEach(items.indices, id: \.self) {index in // << here !!
Text(self.items[index])
}.onDelete(perform: deleteItem)