Swiftui coredata foreach scrollview:删除按钮

Swiftui coredata foreach scrollview : delete button

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

这是我当前的摘要代码。

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()
}