【问题标题】:Xcode preview crashes on DB loop read SwiftUIXcode 预览在 DB 循环读取 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

标签: swift xcode core-data swiftui


【解决方案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())
    }
}

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2018-02-23
    相关资源
    最近更新 更多