.onDelete未调用函数swiftUI



我正在尝试删除列表中核心数据对象数组的成员。我使用滑动删除内置函数来实现这一点(.onDelete(,但当我调试代码时(没有显示任何错误(,它根本不调用该函数(没有命中任何断点(。没有错误。

我尝试过很多不同的.onDelete实现,但似乎都没有真正触发.onDelete.

这是我的代码

//
//  FilteredList.swift
//  Workout
//
//  Created by Kaden Thompson on 3/9/22.
//
import SwiftUI
struct FilteredList: View {
@Environment(.managedObjectContext) var moc
@FetchRequest var fetchRequest: FetchedResults<Workout>
var filter: String
init(filterIn: String) {
filter = filterIn
_fetchRequest = FetchRequest<Workout>(sortDescriptors: [SortDescriptor(.order, order: .reverse)], predicate: NSPredicate(format: "type = %@", filterIn))
}
var body: some View {

NavigationView{
List() {
ForEach(fetchRequest, id: .self) { workout in
let dateString: String = workout.date ?? ""
let dateStringTitleStep = dateString.firstIndex(of: " ")!
let dateStringTitle: String = String(dateString[...dateStringTitleStep])
let dateStringTime: String = String(dateString[dateStringTitleStep...])
let weight: String = workout.weight ?? ""
let reps: String = workout.rep ?? ""
if (workout.last){
Text(dateStringTitle).font(.title).fontWeight(.bold).padding(.vertical, 20.0)
}
HStack{

let displayString: String = "Time: " + dateStringTime.replacingOccurrences(of: " ", with: "")
Text(displayString).bold()
Spacer()
if(filter == "Elliptical"){
let displayString2: String = "Time: " + weight + "nResistance: " + reps
Text(displayString2)
}
else{
let displayString2: String = "Weight: " + weight + "nReps: " + reps
Text(displayString2)
}
Spacer()
}

}
.onDelete(perform: deleteWorkouts)
}
.navigationTitle(filter.replacingOccurrences(of: "_", with: " "))
.navigationBarItems(leading: Image(filter).resizable().frame(width:40, height:40, alignment: .center).cornerRadius(20))

}
}
func deleteWorkouts(at offsets: IndexSet) {
for offset in offsets {
// find this book in our fetch request
let workout = fetchRequest[offset]
// delete it from the context
moc.delete(workout)
}
// save the context
try? moc.save()
}

}

问题似乎是由于

if (workout.last){..}

你可以尝试使用

if (workout.last){..} else { 
HStack {...} 
}

或者,您可以尝试将ForEach的内部封装在VStack中,例如:

ForEach(fetchRequest, id: .self) { workout in
VStack {
...
}
}

最新更新