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如何在预览(Preview)调试中避免与SwiftUI正常运行时环境不一致导致的崩溃