5

基本的にマスター詳細タイプであるSwiftUIで構築されたかなり単純なアプリがあります。データは Core Data に保存されます。レコードの追加と更新は正常に機能しますが、リスト ビューから項目を削除するとアプリが常にクラッシュします。削除を行うために .onDelete 修飾子を使用しています。エラー メッセージは表示されません。スレッドが壊れているだけです。レコードは実際に削除されているため、リスト ビューの再レンダリングで更新されたデータが受信されていないと推測しています。

夢想かもしれませんが、前の 2 つのベータ版で削除機能が機能していたことは確かです。アプリはデバイス上でのみ実行されます。プレビューでもシミュレーターでも機能しません。

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

}

そしてマネージドオブジェクト:

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
    }
}

任意のガイダンスをいただければ幸いです。

4

1 に答える 1