【发布时间】:2020-06-21 14:02:44
【问题描述】:
我为 coredata 中的音频项目制作了一个列表。删除后,crash 报“EXC_BREAKPOINT (code=1, subcode=0x1b8fb693c)”,为什么?
使用时
ForEach(items, id: \.self)
,它的工作原理。但 My Audio 具有 id 属性并遵循 Identifiable 协议。
更新:我发现添加 if{} 子句可以修复崩溃,但为什么呢? “静态 UUID.unconditionallyBridgeFromObjectiveC(:) ()”处的断点。
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()
})
}
}
}
【问题讨论】: