SwiftUI 预览中的模拟核心数据对象

Mic*_*bob 3 xcode core-data ios swift swiftui

当我尝试传入预览 Core Data 对象时,Xcode 的预览画布不断崩溃,没有错误消息,如下所示:

import SwiftUI
import CoreData

struct BookView: View {
    let book: Book
    
    var body: some View {
        Text("Hello, World!")
    }
}

// ^^^ This stuff is fine ^^^

// vvv This stuff is not vvv

struct BookView_Previews: PreviewProvider {
    static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    
    static var previews: some View {
        let book = Book(context: moc)
        book.title = "Test book"
        book.author = "Test author"
        book.genre = "Fantasy"
        book.rating = 4
        book.review = "This was a great book; I really enjoyed it."
        
        return NavigationView {
            BookView(book: book)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在关注有关 Core Data 和 SwiftUI 的 Hacking with Swift 教程,并且正在执行此步骤

这似乎是将预览对象添加到 SwiftUI 画布的标准方法,但我无法让它工作。仅供参考,该应用程序在模拟器中运行良好,我只是想让它也能在预览画布中工作。我在 macOS 12 上使用 Xcode 13.2.1。

谢谢你!

lor*_*sum 5

而不是创建一个NSManagedObjectContext用途

static let context = PersistenceController.preview.container.viewContext
Run Code Online (Sandbox Code Playgroud)

该变量在标准 Xcode 项目中通过 Core Data 提供。

另外,如果您一直使用真实商店进行预览,它可能会以某种方式损坏,因此您可能必须销毁。

添加下面的代码

    do{
        try container.persistentStoreCoordinator.destroyPersistentStore(at: container.persistentStoreDescriptions.first!.url!, type: .sqlite, options: nil)
    }catch{
        print(error)
    }
Run Code Online (Sandbox Code Playgroud)

就在下面

container = NSPersistentCloudKitContainer(name: "YourAppName")
Run Code Online (Sandbox Code Playgroud)

在加载商店之前。

这会破坏存储,然后在您调用时重新创建它,loadPersistentStores请务必在清除预览设备后删除该代码段,这样您就不会意外破坏另一个您不想破坏的存储。