SwiftUI CoreData崩溃预览

时间:2019-12-28 21:08:37

标签: swift core-data swiftui

我有以下代码来绘制汽车列表,数据存储在coredata中。

但是,当我添加从数据库中获取数据的代码行时,swiftui预览似乎会中断。

错误日志显示以下内容:

  

PotentialCrashError:测试app.app可能已崩溃

     

里程里程app.app可能已崩溃。校验   〜/ Library / Logs / DiagnosticReports,查看您的任何崩溃日志   应用。

     

=================================

     

|错误Domain = com.apple.dt.ultraviolet.service代码= 12“呈现   服务被中断” UserInfo = {NSLocalizedDescription =正在渲染   服务被中断}

这是这段代码,其中foreach的开始和结束会导致错误:

import SwiftUI

struct CarListView: View {

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Car.all()) var cars: FetchedResults<Car>

    var body: some View {

        NavigationView {
            ZStack {
                List {
                    Section(header: Text("Cars")) {
                        ForEach(self.cars, id: \.numberPlate) { car in
                            HStack {
                                VStack(alignment: .leading) {
                                    Text(car.name)
                                    Text(car.numberPlate)
                                }
                            }
                        }
                    }
                }
            }
        }
    }

}

struct CarListView_Previews: PreviewProvider {
    static var previews: some View {
        CarListView()
    }
}

2 个答案:

答案 0 :(得分:0)

问题似乎与以下事实有关:无法以某种方式获取允许以预览模式获取数据的上下文。通过手动在预览模式下进行操作,可以解决此问题。

struct CarListView_Previews: PreviewProvider {
    static var previews: some View {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        return CarListView().environment(\.managedObjectContext, context)

    }
}

答案 1 :(得分:0)

如果其他人想知道,这会崩溃,因为在模拟特定视图的预览时,它没有基本系统环境提供的上下文信息:在本例中,为 managedObjectContext。因此,它会崩溃,因为他正在引用环境提供的对象。通过提供对象的静态版本(viewContext:ManagedObjectContext),它允许预览加载和断言任何需要的上下文。

对于大多数较新的应用程序,以下内容也适用:

struct CarListView_Previews: PreviewProvider {
static var previews: some View {
let persistentController = PersistentController.preview
CarListView().environment(\.managedObjectContext, persistentController.container.viewContext)
}
}