【问题标题】:SwiftUI CoreData crashes previewSwiftUI CoreData 崩溃预览
【发布时间】:2020-04-18 06:11:10
【问题描述】:

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

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

错误日志告诉以下内容:

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

mileage app.app 可能已崩溃。查看 ~/Library/Logs/DiagnosticReports 来自您的任何崩溃日志 应用。

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

|错误域=com.apple.dt.ultraviolet.service Code=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()
    }
}

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 你应该使用PersistentController.preview vs PersistentController.shared
      • 是的,这是真的。 PersistentController.preview 允许您将 CoreData 放在内存中,并区分哪些是要测试的,哪些不是。
      猜你喜欢
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2020-07-26
      相关资源
      最近更新 更多