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

Mock Core Data object in SwiftUI Preview

Xcode 的预览 canvas 在我尝试像这样传入预览 Core Data 对象时一直崩溃且没有错误消息:

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)
        }
    }
}

我正在关注关于核心数据和 SwiftUI 的 Hacking with Swift 教程,我在 this step

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

谢谢!

而不是创建 NSManagedObjectContext 使用

static let context = PersistenceController.preview.container.viewContext

标准 Xcode 核心数据项目中提供了该变量。

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

添加下面的代码

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

正下方

container = NSPersistentCloudKitContainer(name: "YourAppName")

加载商店之前。

这会破坏商店,然后在您调用时重新创建它 loadPersistentStores 请务必在清除预览设备后删除那段代码,以免意外破坏您不是故意的另一个商店摧毁。