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