SwiftUI传递Core Data实体参数到视图时预览崩溃如何解决?
核心原因
所有Core Data的Category实体都是NSManagedObject的子类,实例化时必须绑定到一个NSManagedObjectContext(托管上下文)。你直接调用Category()创建的是无上下文的游离实例,预览环境没有默认的Core Data栈上下文,因此触发崩溃。而主界面中使用的Category实例都是通过Core Data栈查询/创建的,已经绑定了上下文,因此运行正常。
修复方案
只需在预览中创建一个临时的内存型托管上下文,用它来初始化Category实例即可,修改后的预览代码如下:
struct CategoryOverview_Previews: PreviewProvider { // 预览专用的临时托管上下文 static let previewContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) static var previews: some View { // 绑定上下文创建Category实例 let category = Category(context: previewContext) category.id = UUID() category.timestamp = Date() category.name = "Clean" // 如果需要预览records的计数效果,可提前添加测试数据 // let testRecord = Record(context: previewContext) // category.addToRecords(testRecord) return CategoryOverview(category: category) } }
复用优化
如果多个预览都需要用到测试用的Category实例,可以把初始化逻辑封装到扩展中,减少重复代码:
extension Category { static func previewSample( name: String = "Clean", in context: NSManagedObjectContext = CategoryOverview_Previews.previewContext ) -> Category { let category = Category(context: context) category.id = UUID() category.timestamp = Date() category.name = name return category } } // 之后预览代码可简化为: // return CategoryOverview(category: .previewSample())
内容的提问来源于stack exchange,提问作者byron1st
相关产品推荐
相关产品推荐

