SwiftUI:onDelete无法正确更新UI

时间:2020-10-07 10:17:41

标签: swiftui

当我使用onDelete()删除数组的元素时,它会删除数据中的正确项目,但会删除UI上的最后一项。我看到了this answer,但我已经在使用它的建议。有什么建议吗?

struct ContentView: View {
    @State var items = ["One", "Two", "Three"]
    
    var body: some View {
        Form{
            ForEach(items.indices, id:\.self){ itemIndex in
                
                let item = self.items[itemIndex]
                
                EditorView(container: self.$items, index: itemIndex, text: item)
                
            }.onDelete(perform: { indexSet in

                self.items.remove(atOffsets: indexSet)

            })
        }
    }
}

这是EditorView结构:

struct EditorView : View {
    var container: Binding<[String]>
    var index: Int

    @State var text: String
    
    var body: some View {
        TextField("Type response here", text: self.$text, onCommit: {
            self.container.wrappedValue[self.index] = self.text
            
        })
    }
}

1 个答案:

答案 0 :(得分:1)

您的ForEach遍历数组的indices,因此SwiftUI用来标识它们。删除一项时,数组的索引将减少一个,因此SwiftUI会将其解释为最后一个被删除。

要正确执行此操作,您应该遍历具有唯一Identifiable的{​​{1}}个项目的列表。在这里,我创建了一个名为id的{​​{1}},其中包含原始struct和唯一生成的MyItem。我使用String将项目转换为id

此外,您的代码在循环中需要索引,因此请在.map(MyItem.init)上循环,这将为您提供[MyItem]元组的数组。然后告诉SwiftUI将Array(items.enumerated())用作(offset, element)

请注意,\.element.id现在采用id的数组。

通过这些更改,SwiftUI将能够识别您从列表中删除的项目并正确更新UI。

EditorView