Xcode 预览在 DB 循环读取 SwiftUI 时崩溃

Posted

技术标签:

【中文标题】Xcode 预览在 DB 循环读取 SwiftUI 时崩溃【英文标题】:Xcode preview crashes on DB loop read SwiftUI 【发布时间】:2020-05-22 15:23:46 【问题描述】:

当我使用以下方式调用 Core Data 时:

 @FetchRequest(
        entity: Entity.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Entity.id, ascending: true),
        ]
    )  var myData: FetchedResults<Entity>

然后在视图内部:

VStack 
    ForEach(myData, id: \.self)  data in
        Text("Test")
    

Xcode 实时预览崩溃,如果我用一个简单的文本删除 ForEach 它会起作用,我该如何解决这个问题?这是我目前的预览:

struct HomeItemListView_Previews: PreviewProvider 
    static var previews: some View 
        HomeItemListView()
    

这是它显示的错误:

PotentialCrashError: MyApp.app may have crashed

MyApp.app may have crashed. Check ~/Library/Logs/DiagnosticReports for any crash logs from your application.

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

|  Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo=NSLocalizedDescription=Rendering service was interrupted

作为旁注,代码可以正常编译并在普通模拟器上正常显示,这是有问题的实时模拟器。

更新: 所以我有一个 viewRouter 来控制第一个屏幕,例如 Onboarding,如果为 true,则进入 onboarding,如果为 false,则进入 HomeView。 这就是我设置 SceneDelegate 的方式:

let viewRouter = ViewRouter()

        let contentView = MotherView()
            .environment(\.managedObjectContext, context)
            .environmentObject(viewRouter)

            // Set the MotherView as the root view
            window.rootViewController = UIHostingController(rootView: contentView)

在我的 MotherView 上,我有这样的预览:

struct MotherView_Previews: PreviewProvider 
    static var previews: some View 
        MotherView().environmentObject(ViewRouter())
    

在主页视图上我有这样的:

struct HomeView_Previews: PreviewProvider 
    static var previews: some View 
        HomeView()
    

【问题讨论】:

很可能是上下文环境或某些 environmentObject 未设置。 如何检查?在 SceneDelegate 中? @Asperi 对于预览(在预览提供程序中),您应该以与在运行时场景委托中相同的方式设置所有内容(如果它是根视图,则在父视图中设置)是子视图) 我更新了上面的代码并添加了一些更多信息,例如 SceneDelegate,有帮助吗? @Asperi 【参考方案1】:

所以,很可能,您的HomeItemListView 预览应该设置如下

struct HomeItemListView_Previews: PreviewProvider 
    static var previews: some View 
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

        return HomeItemListView()
                .environment(\.managedObjectContext, context)
                .environmentObject(ViewRouter())
    

【讨论】:

以上是关于Xcode 预览在 DB 循环读取 SwiftUI 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

Xcode SwiftUI 如何滚动预览画布?

Xcode如何在预览(Preview)调试中避免与SwiftUI正常运行时环境不一致导致的崩溃

Xcode如何在预览(Preview)调试中避免与SwiftUI正常运行时环境不一致导致的崩溃

SwiftUI Xcode项目新增单元测试(Unit Test)后预览(Preview)崩溃的解决