Home > Net >  SwiftUI- Missing argument for parameter 'at' in call
SwiftUI- Missing argument for parameter 'at' in call

Time:01-26

I'm following a CoreData tutorial and want to delete items from a list. For iPhone in this case would be .onDelete(perform: deleteBudget) to swipe and delete.

But I'm developing for macOS instead, using .contextMenu to right click and delete.

I'm getting this error next to deleteBudget() in the button inside the contextMenu:

Missing argument for parameter 'at' in call

I'm not sure the correct parameters to include with 'at'.

Content View

@ObservedObject private var budgetListVML: BudgetListViewModel

     init(vm: BudgetListViewModel){
                self.budgetListVML = vm
            }
        
   

 private func deleteBudget(at offsets: IndexSet) {
        offsets.forEach { index in
                let budget = budgetListVML.budgets[index]
                budgetListVML.deleteBudget(budgetId: budget.id)
            }
        

  List{
        ForEach(budgetListVML.budgets) { budget in
               NavigationLink{....
                }
               .contextMenu { 
                        Button {
                            deleteBudget()
                        } label: {
                            Text("Delete Budget")
                        }
                }
        }
            
  }

BudgetListViewModel

class BudgetListViewModel:NSObject, ObserverableObject {
@Published var budgets = [BudgetViewModel]()
.......
    func deleteBudget(budgetId: NSManagedObjectID){
        do {
            guard let budget = try context.existingObject(with: budgetId) as? Budget else {
                return
        }
        try budget.delete()
        
    } catch {
        print(error)
    }
}
....
}

 struct BudgetViewModel: Identifiable {
    private var budget: Budget
    
    init(budget: Budget) {
        self.budget = budget
    }


    var id: NSManagedObjectID {
        budget.objectID
          }

    var name: String {
        budget.name ?? ""
          }
       }

CodePudding user response:

Your deleteBudget function has an at parameter in its definition:

private func deleteBudget(at offsets: IndexSet) {
                          ^^ <--- Here

This is useful when using, for example List's onDelete which passes an IndexSet.

For your use case, where you don't have an IndexSet within the contextMenu, I'd suggest making a deleteBudget function that takes a Budget directly:

private func deleteBudget(_ budget : Budget) {
   budgetListVML.deleteBudget(budget)
}

and in your contextMenu, call:

.contextMenu { 
   Button {
     deleteBudget(budget)
   } label: {
     Text("Delete Budget")
   }
}

and in your view model:

func deleteBudget(_ budget: Budget){
    do {
      try budget.delete()
    } catch {
      print(error)
    }
}
  •  Tags:  
  • Related