コンテキスト メニューでリスト アイテムを削除しようとしています。データは Core Data から取得されます。
.onDelete は、これ以上何もしなくても、私の deleteExercise 関数で期待どおりに動作します。しかし、コンテキスト メニュー ボタン内で deleteExercise を呼び出すと、IndexSet を要求されますが、正直なところ、どこから取得すればよいかわかりません。
.onDelete を使用するときに IndexSet を指定する必要がないのも不思議です
struct ExercisesView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(key: "name", ascending: true)],
animation: .default)
private var exercises: FetchedResults<Exercise>
var body: some View {
NavigationView {
List {
ForEach(exercises) { e in
VStack {
NavigationLink {
ExerciseDetailView(exercise: e)
} label: {
Text(e.name ?? "")
}
}
.contextMenu { Button(role: .destructive, action: { deleteExercise(offsets: /* Index Set */) }) {
Label("Delete Exercise", systemImage: "trash")
} }
}
.onDelete(perform: deleteExercise)
}
}
}
private func deleteExercise(offsets: IndexSet) {
withAnimation {
for index in offsets {
let exercise = exercises[index]
viewContext.delete(exercise)
}
viewContext.save()
}
}
}