Cra sh при удалении записи из coredata в SwiftUI - PullRequest
0 голосов
/ 09 марта 2020

Я делаю список аудио предметов из coredata. после удаления cra sh сообщает как «EXC_BREAKPOINT (code = 1, subcode = 0x1b8fb693 c)», почему?

При использовании

ForEach(items, id: \.self)

это работает. Но My Audio имеет свойство id и следует протоколу Identifiable.

ОБНОВЛЕНИЕ: Я обнаружил, что добавление условия if {} исправит cra sh, но почему? Точка останова в точке "stati c UUID. безусловно" BridgeFromObjective C ( :) () ".

struct Test1View: View {
    @Environment(\.managedObjectContext) var context
    @FetchRequest(fetchRequest: Audio.fetchAllAudios()) var items: FetchedResults<Audio>
    var body: some View {
        List {
            ForEach(items) { item in
                if true { // <- this if clause fix crash, but why?
                    HStack {
                        Text("\(item.name)")
                    }
                }
            }.onDelete(perform: { indexSet in
                let index = indexSet.first!
                let item = self.items[index]
                self.context.delete(item)
                try? self.context.save()
            })
        }
    }
}

кодируется следующим образом:

class Audio: NSManagedObject, Identifiable {
    @NSManaged public var id: UUID
    @NSManaged public var name: String
    @NSManaged public var createAt: Date
}

struct Test1View: View {
    @Environment(\.managedObjectContext) var context
    var fetchRequest: FetchRequest<Audio> = FetchRequest<Audio>(entity: Audio.entity(), sortDescriptors: [NSSortDescriptor(key: "createAt", ascending: false)])
    var items: FetchedResults<Audio> { fetchRequest.wrappedValue }
    var body: some View {
        List {
            ForEach(items) { item in
                HStack {
                    Text("\(item.name)")
                }
            }.onDelete(perform: { indexSet in
                let index = indexSet.first!
                let item = self.items[index]
                self.context.delete(item)
                try? self.context.save()
            })
        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 марта 2020

У меня была та же проблема на выходных. Похоже, что SwiftUI хочет развернуть значение, которое я прочитал из CoreData, и, поскольку значение уже удалено, оно падает.

В моем случае я решил это с объединением нулей для всех значений, которые я использую из CoreData.

Вы можете указать значение по умолчанию для вашего item.name с помощью

ForEach(items) { item in
            HStack {
                Text("\(item.name ?? "")")
            }
        }
0 голосов
/ 13 марта 2020

Я нашел причину cra sh, должен предоставить дополнительно, из-за преобразования OC / swift объекта:

преобразовать

class Audio: NSManagedObject, Identifiable {
    @NSManaged public var id: UUID
    @NSManaged public var name: String
    @NSManaged public var createAt: Date
}

в

class Audio: NSManagedObject, Identifiable {
    @NSManaged public var id: UUID?
    @NSManaged public var name: String?
    @NSManaged public var createAt: Date?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...