Swiftui coredata foreach scrollview:删除按钮



我试图在每个列表上添加删除按钮。(不使用滑动功能)

这是我当前的摘要代码。

import SwiftUI
struct ContentView: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: Saving.entity(), sortDescriptors: [
NSSortDescriptor(KeyPath: Saving.orders, ascending: true),
~~~
]
) var savings : FetchedResults<Saving>

var body: some View {
NavigationView{
ScrollView(.vertical, showsIndicators: false){
ForEach(savings, id : .self) { save in
ZStack{
HStack(alignment: .top){
Menu(content: {Button(action: {
self.delete(at:IndexSet.init(arrayLiteral: 0))}) {
Text("Delete")
Image(systemName: "trash")}
})  {
Image(systemName:"line.horizontal.3")}
}
}
}
}
}
}
func delete(at offsets: IndexSet) {
for index in offsets {
let deletes = saving[index]
self.moc.delete(deletes)
}
try! self.moc.save()
}
}

我可以在按钮操作时指定索引号,当我点击列表中有很多行的按钮时,我可以一次又一次地删除第一行。这就像当我在任何一行点击删除按钮时,第一行总是被删除。很明显,因为索引号是0。我想在点击该行按钮时删除该行。我怎样才能解决这个问题?谢谢大家!

您需要传递正确的索引而不是' ' ' IndexSet。init (arrayLiteral: 0) ' '

因此使用indices并首先找到索引并将其作为Int索引传递。像这样,

肉体理论

var body: some View {
NavigationView{
ScrollView(.vertical, showsIndicators: false){
ForEach(savings.indices, id : .self) { index in //<--- Here
let save = savings[index] //<--- Here
ZStack{
HStack(alignment: .top){
Menu(content: {Button(action: {
self.delete(at: index)}) { //<--- Here
Text("Delete")
Image(systemName: "trash")}
})  {
Image(systemName:"line.horizontal.3")}
}
}
}
}
}
}

删除功能
func delete(at index: Int) { //<--- Here
let deletes = saving[index]
self.moc.delete(deletes)
try! self.moc.save()
}

最新更新