我目前无法解释的应用程序崩溃是同时隐藏多行。我使用过滤器功能过滤掉行。当EditMode更改时,过滤条件也会更改(请参见check
函数)。
项目成功显示在列表中,但是一旦列表中有多个项目消失,应用就会崩溃(不幸的是,msg没有错误)。
import SwiftUI
struct ContentView: View {
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Task.entity(),
sortDescriptors: []) var tasks: FetchedResults<Task>
@State private var showingAddToDo = false
@State var isEditMode: EditMode = .inactive
var body: some View {
NavigationView {
List {
ForEach(tasks.filter{return self.check(task: $0)}, id: \.self) { task in
TaskRowView(
title: task.wrappedTitle,
status: task.wrappedStatus,
timestamp: task.wrappedTimestamp,
highPriority: task.highPriority,
showDetail: self.isEditMode == EditMode.active
).onTapGesture {
self.toggleStatus(item: task)
}
}
.onDelete(perform: removeTask)
}
.navigationBarTitle("Today")
.navigationBarItems(leading: EditButton(),trailing: Button("Add") {self.showingAddToDo.toggle()})
.sheet(isPresented: $showingAddToDo) {
AddView().environment(\.managedObjectContext, self.moc)
}
.environment(\.editMode, self.$isEditMode)
}.onAppear(perform: {
print("Hello World")
})
}
func toggleStatus(item: Task) {
item.status = item.status == "open" ? "done" : "open"
let feedbackGenerator = UIImpactFeedbackGenerator(style: .medium)
feedbackGenerator.impactOccurred()
save()
}
func removeTask(at offsets: IndexSet) {
for index in offsets {
let item = tasks[index]
moc.delete(item)
}
save()
}
func save() {
try? moc.save()
}
func check(task: Task) -> Bool {
if (self.isEditMode == EditMode.active) {
return true
}
return task.title == "Test123"
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
return ContentView().environment(\.managedObjectContext, context)
}
}
#endif