在 SwiftUI 中不使用 onDelete 删除 CoreData

Deleting CoreData without onDelete in SwiftUI

我的应用程序在 VStack 中显示如下 CoreData。由于 ScrollView,无法列出列表。

 VStack (spacing: 20) {
    ForEach(groups) { group in
        NavigationLink(destination: GroupView()) {
            ZStack (alignment: .bottomLeading) {
            
            Image(uiImage: (UIImage(data: group.groupThumbnail ?? self.image) ?? UIImage(named: "defaultGroupThumbnail"))!)
                .resizable(capInsets: EdgeInsets())
                .aspectRatio(contentMode: .fill)
                .frame(height: 200, alignment: .center)
                .cornerRadius(22)
            
            VStack (alignment: .leading) {
                
                Text("\(group.groupTitle ?? "Untitled")")
                    .font(.title)
                    .fontWeight(.heavy)
                    .multilineTextAlignment(.leading)
                
                Text("Consists of 5 Flowers")
            }
            .padding([.leading, .bottom], 18.0)
            .foregroundColor(.primary)
        }

但是,我可以使用 onDelete 删除我的条目。因此,我试图找到 .contextMenu 的替代方案。

.contextMenu {
    Button (role: .destructive) {
        withAnimation {
            self.deleteGroups(at: IndexSet.init(arrayLiteral: 0)) // This is the code I copied from the video.
        }
    } label: {
        Label("Delete", systemImage: "trash")
    }
    Button {
        print()
    } label: {
        Label("Edit", systemImage: "square.and.pencil")
    }

}

我看到一个视频,其中有人可以通过结合使用这些代码来删除他的条目 当点击“删除”时,应通过以下代码删除该条目:

func deleteGroups(at offsets: IndexSet) {
        for offset in offsets {
            let group = groups[offset]
            viewContext.delete(group)
        }
        //try? viewContext.save()
    }

但是,每当我在上下文菜单中单击此“删除”按钮时,都会删除错误的按钮。我无法获取删除所选条目的代码。如果有人可以帮助我,那将不胜感激。提前致谢!

不是那么重要,但是,与“onDelete”相比,是否有删除功能(例如滑动删除)我仍然可以实现?在我的情况下是否有动画的可能性?

亲切的问候

按正常方式删除即可:

Button (role: .destructive) {
    withAnimation {
        viewContext.delete(group)
        do {
            try viewContext.save()
        } catch {
            // show error
        }
    }
} label: {
    Label("Delete", systemImage: "trash")
}

仅供参考,我还编辑了您的问题以修复您的 ForEach 语法。

ForEach(groups, id: \.self) { group in

.contextMenu {
Button (role: .destructive) {
   
        for index in groups.indices{
           if group == groups[index]{
           withAnimation{
           viewContext.delete(group)
          }
        }
      }
} label: {
    Label("Delete", systemImage: "trash")
}
Button {
    print()
} label: {
    Label("Edit", systemImage: "square.and.pencil")
}

}