带有.indices()的SwiftUI ForEach在onDelete之后不会更新

时间:2020-07-15 07:23:45

标签: swiftui indices

我的问题是:我有一些物品的简单阵列。我想使用ListForEach来显示带有这些项目的.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(这是预期的第一个索引)数组)。为什么会这样,我该如何解决呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

只需使用动态内容ForEach构造函数(_ data: .., id: ...)

ForEach(items.indices, id: \.self) {index in   // << here !!
    Text(self.items[index])
}.onDelete(perform: deleteItem)