swiftnoob
swiftnoob

Reputation: 413

Delete button for SwiftUI ForEach list item

I'm new to swift and i have a ForEach list that displays information stored with CoreData. The swipe to delete method works .onDelete(perform: vm.deleteMemory) for each item shown on the list but i want a button to delete instead of swiping.

This is what i tried so far with my button action, but i get Cannot convert value of type 'IndexSet.Type' to expected argument type 'IndexSet' error.

    @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
                   
                 
                }

Here is the delete function

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

Upvotes: 2

Views: 4101

Answers (1)

mahan
mahan

Reputation: 14935

You should change the signature of deleteMemory as the follwing:

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

Entity is type of your entities.

And then call deleteMemory(entity: enttiy).

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

Doing so you avoid retrieving Entity from saveList in 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()
        }
    }

However, I would not use withAnimation in 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()
    }

Upvotes: 3

Related Questions