如何解决SwiftUI:onDelete无法正确更新UI
当我使用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
})
}
}
解决方法
您的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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。