SwiftUI @FetchRequest使应用程序崩溃并返回错误

时间:2020-02-23 15:23:49

标签: swift macos swiftui swift5 xcode11

我正在尝试通过Xcode 11在SwiftUI中使用Mac应用程序中的核心数据。 创建项目时,我已选中“使用核心数据”。 我还创建了实体(称为VisitedCases),并使用编辑器创建了NSManagedObject子类文件。我也将Codegen设置为Manual / none。 这是生成的NSManagedObject文件中的代码:

VisitedCases + CoreDataProperties.swift

extension VisitedCases {

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

    @NSManaged public var caseNumber: String

} 

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

我的代码有什么问题,我应该怎么解决?

3 个答案:

答案 0 :(得分:1)

尝试像这样在managedObjectContext中分配ContentView

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)

答案 1 :(得分:0)

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

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

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

然后ManagedObjectContext可以工作。

 @Environment(\.managedObjectContext) var managedObjectContext

答案 2 :(得分:0)

这对我有用我正在为我的 CoreData 实体使用 NSManagedObject 子类(代码生成定义中的手动/无),因为我正在进行一些解包。我必须删除该类并使用编辑器重新生成然后一切重新工作