列表视图的SwiftUI .onDelete导致App崩溃

时间:2019-08-30 16:53:11

标签: ios xcode core-data swiftui macos-catalina

我有一个使用SwiftUI构建的相当简单的应用程序,它本质上是一个大师 详细信息类型。数据存储在核心数据中。添加和更新记录工作正常, 但从列表视图中删除项目时,该应用程序始终会崩溃。我正在使用 .onDelete修饰符进行删除。我没有收到任何错误消息-只是 断线。该记录确实已删除,所以我猜想是重新渲染 列表视图中的未接收到更新数据。

我可能正在做梦,但是我很确定删除功能在以前的版本中是有效的 两个Beta。该应用程序仅在设备上运行。在预览版和模拟器中都无法使用。

iOS 13.1,Xcode(11392r),卡塔琳娜(19A546d)

这是ContentView():

struct ContentView: View {

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: ToDoItem.getAllToDoItems()) var toDoItems: FetchedResults<ToDoItem>

    @State private var newToDoItem = ""

    var body: some View {
        NavigationView {
            List {
                 Section(header: Text("Records")) {
                    ForEach(self.toDoItems) { toDoItem in
                        NavigationLink(destination: EditToDo(toDoItem: toDoItem)) {
                            ToDoItemView(title: toDoItem.title!,
                                         firstName: toDoItem.firstName!,
                                         lastName: toDoItem.lastName!,
                                         //createdAt: "\(toDoItem.createdAt!)")
                                createdAt: self.localTimeString(date: toDoItem.createdAt!)
                                        )
                        }
                    }
                    .onDelete { indexSet in
                        let deleteItem = self.toDoItems[indexSet.first!]
                        self.managedObjectContext.delete(deleteItem)

                        do {
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)
                        }
                    }
                    .onMove(perform: move)
                }
            }
            .navigationBarTitle("Customers")
            .navigationBarItems(trailing: EditButton())
        }
    }

    func move(from source: IndexSet, to destination: Int) {
        print("this is the move method with no actions")
    }

    func localTimeString(date: Date) -> String {
        let formatter = DateFormatter()
        formatter.timeZone = .current
        formatter.dateFormat = "M-d-yyyy HH:mm:ss"
        let returnString = formatter.string(from: date)
        return returnString
    }//localTimeString

}

和managedObject:

public class ToDoItem : NSManagedObject, Identifiable {
    @NSManaged public var id: UUID
    @NSManaged public var createdAt: Date?
    @NSManaged public var title: String?
    @NSManaged public var firstName: String?
    @NSManaged public var lastName: String?
}

extension ToDoItem {

    static func getAllToDoItems() -> NSFetchRequest<ToDoItem> {
        let request: NSFetchRequest<ToDoItem> = ToDoItem.fetchRequest() as! NSFetchRequest<ToDoItem>
        let sortDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)
        request.sortDescriptors = [sortDescriptor]
        return request
    }
}

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:3)

这似乎难以置信,但是显然在实体中将属性命名为“ id”是导致此行为的原因。我将UUID属性的名称更改为“ myID”,现在可以进行删除了。进行更改之前,我将Xcode更新为GM种子2(重命名之前,崩溃仍然发生在GM2中)。列表视图在预览中仍然无法使用,但是现在可以在模拟器和设备中使用。