Xcode 12.1

我正在研究Paul Hudson的《 SwiftUI的100天》,而Project 11遇到了CoreData令人沮丧的问题。这是Paul的代码的直接提升,该代码可以在他的视频中编译并运行良好。 Bookworm.xcdatamodeld具有一个名为Student的单一实体,该实体具有两个属性:一个名为id的UUID和一个名为name的字符串。

它可以很好地编译,但是运行它会导致ForEach崩溃,红色标记的是“学生”。控制台中弹出的错误消息是:

2020-10-31 12:13:47.934507-0400 Bookworm [614:7766183] [错误]错误:在任何模型中,没有NSEntityDescription声明拥有NSManagedObject子类'Bookworm.Student',因此+实体被混淆了。您已经加载了NSManagedObjectModel吗? CoreData:错误:在任何模型中,没有NSEntityDescriptions声明NSManagedObject子类'Bookworm.Student',所以+实体被混淆了。您已经加载了NSManagedObjectModel吗? 2020-10-31 12:13:47.934651-0400 Bookworm [614:7766183] [错误]错误:+ [Bookworm.Student实体]无法找到NSEntityDescription与托管对象子类的唯一匹配 CoreData:错误:+ [Bookworm.Student实体]无法找到NSEntityDescription与托管对象子类的唯一匹配 2020-10-31 12:13:47.953419-0400 Bookworm [614:7766183] [SwiftUI]环境中的上下文未连接到持久性存储协调器:

我已经搜索了很多,并尝试了发现的所有推荐解决方案,包括:简单地关闭并重新打开Xcode(步骤1),清理项目,然后重复步骤1,并删除所有派生数据并重复步骤1。我已经验证了在检查器中为该模块选择了“当前产品模块”,并且Codegen选择了“类定义”。

import SwiftUI
import CoreData

struct ContentView: View {

    @Environment(\.managedobjectcontext) var moc
    @FetchRequest(entity: Student.entity(),sortDescriptors: []) var students: FetchedResults<Student>

    var body: some View {
        VStack {
            List {
                ForEach(students,id: \.id) { student in
                    Text(student.name ?? "Unknown")
                }
            }
        }
    }
 }
chipingguodexiaowang 回答:Xcode 12.1

如果您使用的是SwiftUI生命周期,则应在父视图(或应用程序)中初始化NSPersistentContainer并将导入的ManagedObjectContext导入环境。

在您的情况下,可能是这样的:

import SwiftUI
import CoreData

@main
struct coreDataParadigmApp: App {
    let persistenceController = PersistenceController.shared
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext,persistenceController.container.viewContext)
        }
    }
}


struct ContentView: View {
    @FetchRequest(entity: Student.entity(),sortDescriptors: []) var students: FetchedResults<Student>
    var body: some View {
        VStack {
            List {
                ForEach(students,id: \.id) { student in
                    Text(student.name ?? "Unknown")
                }
            }
        }
    }
 }

// DONT FORGET TO CHANGE THE NAME OF YOUR FILE
struct PersistenceController {
    static let shared = PersistenceController()

    let container: NSPersistentContainer

    init() {
        container = NSPersistentContainer(name: "coreDataNameOfFile")

        container.loadPersistentStores(completionHandler: { (storeDescription,error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error),\(error.userInfo)")
            }
        })
    }
}
本文链接:https://www.f2er.com/1300045.html

大家都在问