SwiftUI @FetchRequest 使应用程序崩溃并出现 returns 错误

SwiftUI @FetchRequest crashes the app and returns error

我正在尝试使用 Xcode 11 在我的 mac 应用程序中使用核心数据和 SwiftUI。 我在创建项目时检查了"Using Core Data"。 我还创建了实体(称为 VisitedCases)并使用编辑器创建 NSManagedObject 子类文件。我还将 Codegen 设置为 Manual/none。 这是生成的 NSManagedObject 文件中的代码:

访问案例+CoreDataProperties.swift

extension VisitedCases {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<VisitedCases> {
        return NSFetchRequest<VisitedCases>(entityName: "VisitedCases")
    }

    @NSManaged public var caseNumber: String

} 

访问案例+CoreDataClass.swift

@objc(VisitedCases)
public class VisitedCases: NSManagedObject {

}

我在 ContentView.swift 中将 @Environment 变量和 @FetchRequest 称为:

struct ContentView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(entity: VisitedCases.entity(),
                  sortDescriptors: []
                  ) var orders: FetchedResults<VisitedCases>
//@State vars and the rest of the code
}

但是,当我 运行 时,应用程序一启动就崩溃,并在输出中显示以下错误:

2020-02-23 18:36:16.889306+0330 ImageSelector[17874:149503] [error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
2020-02-23 18:36:16.889389+0330 ImageSelector[17874:149503] [error] error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
2020-02-23 18:36:16.921131+0330 ImageSelector[17874:149503] executeFetchRequest:error: A fetch request must have an entity.

我还有一个函数可以将字符串保存到存储器中,而且似乎工作正常:

    func addCaseNumber (caseNo: String) {
        guard caseNo != "" else {return}
        let newCaseNumber = VisitedCases(context: self.managedObjectContext)
        newCaseNumber.caseNumber = caseNo
        do {
         try self.managedObjectContext.save()
         print("Case number saved.")
        } catch {
         print(error.localizedDescription)
         }
    }

我的代码有什么问题,我应该如何修复它?

尝试像这样在 ContentView 中分配 managedObjectContext

let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

如果这有效,则意味着您的 @Environment var 不工作。

要找出中断发生的位置,请从具有

SceneDelegate 开始
let contentView = ContentView().environment(\.managedObjectContext, context)

然后查看与Environment的连接在哪里中断

在你所有的视图中加入类似这样的东西,看看哪个没有得到 Environment 变量。

@Environment(\.managedObjectContext) var managedObjectContext
     var body: some View {
         print("MOC = ")
         print(managedObjectContext.name ?? "broken")
     return Text("Hello World!")
}

当你发现中断时用

重新建立它
YourBrokenView().environment(\.managedObjectContext, managedObjectContext)

在@enviromentVAr中,有时需要自己设置环境。

 let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

 ContentView().environment(\.managedObjectContext, managedObjectContext)

然后 managedObjectContext 就可以工作了。

 @Environment(\.managedObjectContext) var managedObjectContext

这对我有用我正在为我的 CoreData 实体使用 NSManagedObject 子类(代码生成定义中的Manual/None)因为我正在做一些解包。我必须删除 class 并使用编辑器再次生成,然后一切都再次工作