【问题标题】:Mock Core Data object in SwiftUI Preview在 SwiftUI Preview 中模拟核心数据对象
【发布时间】:2022-01-25 15:33:21
【问题描述】:

当我尝试像这样传递预览 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)
        }
    }
}

我正在关注关于 Core Data 和 SwiftUI 的 Hacking with Swift 教程,我的邮箱是this step。

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

谢谢!

【问题讨论】:

  • @JoakimDanielson 这是完整代码的配对版本,我可以在其中访问对象的属性。视图很好,它正在启动不起作用的预览。

标签: ios swift xcode core-data swiftui


【解决方案1】:

而不是创建NSManagedObjectContext 使用

static let context = PersistenceController.preview.container.viewContext

该变量在带有 Core Data 的标准 Xcode 项目中提供。

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

在下面添加代码

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

正下方

container = NSPersistentCloudKitContainer(name: "YourAppName")

在加载商店之前。

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

【讨论】:

  • 感谢您的解决方案!这很奇怪,但整个NSManagedObjectContext 的事情却没有。该功能是否已弃用?
  • @Microbob 我从来没有真正使用过其他方式。似乎没有必要,您必须检查画布中出现的诊断按钮,以尝试找出崩溃的原因。我不认为它已被弃用。
  • 它说它期望声明我试图把它放在我的 persistence.swift 文件中
  • 所以我能够销毁商店,但是当我关闭应用程序并尝试创建一个新应用程序时,代码永远不会消失它仍然会产生与之前相同的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多