SwiftUI ForEach 列表项的删除按钮

时间:2021-06-23 10:44:37

标签: swift swiftui

我是 swift 的新手,我有一个 ForEach 列表,显示与 CoreData 一起存储的信息。滑动删除方法适用于列表中显示的每个项目 .onDelete(perform: vm.deleteMemory) 但我想要一个按钮来删除而不是滑动。

这是我到目前为止尝试使用按钮操作的方法,但出现 Cannot convert value of type 'IndexSet.Type' to expected argument type 'IndexSet' 错误。

    @StateObject var vm = CoreDataViewModel()
    VStack{
                Label {
                    Text("Here is a list of your memories")
                        .font(.system(size: 25))
                        .foregroundColor(.primary)
                } icon: {
                   Image(systemName: "hands.sparkles")
                    .font(.system(size: 25))
                }
                
                List {
                    ForEach(vm.savedEntites) { entity in
                        Text(entity.name ?? "No Name")
                            .font(.system(size: 25))
                        Button(action: { vm.deleteMemory(indexSet: IndexSet)}) {
                                    Label("Delete",systemImage: "trash")
                                }
                    }
                    .onDelete(perform: vm.deleteMemory) //swipe to delete
                   
                 
                }

这里是删除功能

 func deleteMemory(indexSet: IndexSet) {
         withAnimation {
            guard let index = indexSet.first else {return}
            let entity = savedEntites[index]
            container.viewContext.delete(entity)
             saveData()
         }

1 个答案:

答案 0 :(得分:1)

您应该将 deleteMemory 的签名更改为以下内容:

   func deleteMemory(entity: Entity) {
     ----
   }

Entity 是您的实体类型。

然后调用 deleteMemory(entity: enttiy)

        Button(action: { withAnimation {
            vm.deleteMemory(entity: entity)
        } }) {
            Label("Delete",systemImage: "trash")
        }

这样做可以避免从 Entity 中的 saveList 检索 deleteMemory

    ForEach(vm.savedEntites) { entity in
        Text(entity.name ?? "No Name")
        .font(.system(size: 25))
        Button(action: { vm.deleteMemory(entity: entity)}) {
            Label("Delete",systemImage: "trash")
        }
    }

    func deleteMemory(entity: Entity) {
        withAnimation {
            container.viewContext.delete(entity)
            saveData()
        }
    }

但是,我不会在 withAnimation 中使用 deleteMemory

    
    ForEach(vm.savedEntites) { entity in
        Text(entity.name ?? "No Name")
        .font(.system(size: 25))
        Button(action: { vm.deleteMemory(entity: entity)}) {
            Label("Delete",systemImage: "trash")
        }
    }
    func deleteMemory(entity: Entity) {
        container.viewContext.delete(entity)
        saveData()
    }