当我使用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
})
}
}
答案 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