Core data 在SwiftUI中从coredata删除记录时崩溃
我为coredata中的音频项目制作了一个列表。删除后,崩溃报告为“EXC_断点(代码=1,子代码=0x1b8fb693c)”,为什么 使用时Core data 在SwiftUI中从coredata删除记录时崩溃,core-data,swiftui,Core Data,Swiftui,我为coredata中的音频项目制作了一个列表。删除后,崩溃报告为“EXC_断点(代码=1,子代码=0x1b8fb693c)”,为什么 使用时 ForEach(items, id: \.self) ,它起作用了。但我的音频有id属性并遵循可识别协议 更新:我发现添加if{}子句可以修复崩溃,但为什么?“静态UUID.unconditionallyBridgeFromObjectiveC(:)()”处的断点 struct Test1View:View{ @环境(\.managedObjectCo
ForEach(items, id: \.self)
,它起作用了。但我的音频有id属性并遵循可识别协议
更新:我发现添加if{}子句可以修复崩溃,但为什么?“静态UUID.unconditionallyBridgeFromObjectiveC(:)()”处的断点
struct Test1View:View{
@环境(\.managedObjectContext)变量上下文
@FetchRequest(FetchRequest:Audio.fetchAllAudios())变量项:FetchedResults
var body:一些观点{
名单{
ForEach(items){item in
如果为true{/我在周末遇到了同样的问题。看起来SwiftUI想要打开我从CoreData读取的值,并且由于该值已被删除,它崩溃了
在我的例子中,我确实通过对我从CoreData使用的所有值进行零合并来解决它
您可以尝试为item.name提供默认值
ForEach(items) { item in
HStack {
Text("\(item.name ?? "")")
}
}
我发现崩溃的原因,必须提供可选,因为OC/swift对象转换:
皈依
class Audio: NSManagedObject, Identifiable {
@NSManaged public var id: UUID
@NSManaged public var name: String
@NSManaged public var createAt: Date
}
到
我和你有同样的问题
可能使用您自己的id
属性使其可识别是个坏主意,因为删除对象时,核心数据会将所有属性设置为nil
,即使您在Swift CoreData类中以不同的方式声明它。
删除实体时,id
属性失效,对象.isFault
属性设置为true
,但SwiftUIForEach
仍保留对此id对象(=您的UUID)的一些引用,以便能够计算“before”和“after”列表的状态,并试图以某种方式访问它,导致崩溃
因此,建议如下:
通过检查isFault
,保护详细视图(在ForEach
循环中):
如果entity.isFault{
EmptyView()
}
否则{
//您的常规视图主体
}
期望您的id
属性为nil
,或者在核心数据模型中将其相应地定义为可选属性
@NSManaged公共变量id:UUID?
或者通过不依赖SwiftUIForEach
循环中的可识别的协议:
ForEach(实体,id:\.self){entity in…}
或
ForEach(实体,id:\.objectID){entity in…}
结论:您确实不需要将所有CoreData属性设置为Swift可选的s。在ForEach
循环中引用的id
属性处理删除(=将其值设置为nil
)非常重要优雅地。我有另一个代码,与此示例代码相同,运行良好。我混淆了。和ForEach(items,id:\.self)
将修复此代码。如果这真的是SwiftUI中的CoreData问题,那就太糟糕了。我想知道我是否在这段代码中犯了一些错误。问题是UUID。_无条件地从ObjectiveC
,无指针。添加if true{}子句将修复崩溃,但为什么?ForEach(items){item in if true{HStack{Text(\(item.name)”)}}}
你救了我!我花了30分钟处理了这个错误并解决了:)
ForEach(items) { item in
HStack {
Text("\(item.name ?? "")")
}
}
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?
}