SwiftUI:隐藏多行时崩溃

时间:2019-12-21 18:18:13

标签: swiftui swiftui-list

我目前无法解释的应用程序崩溃是同时隐藏多行。我使用过滤器功能过滤掉行。当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

0 个答案:

没有答案
相关问题