未能在 NSManagedObject Class 上调用指定初始化程序 -- CoreData

Failed to call Designated Initializer on NSManagedObject Class -- CoreData

我真的被这个问题困住了,我已经参考了 Whosebug post 但我的应用程序仍然因这个问题而崩溃:

Failed to call Designated Initializer on NSManagedObject Class

所以,我有多个实体,并且我已经对 NSManagedObject 进行了子类化。假设我有一个名为 FirstEntity, SecondEntity, ThirdEntity, Fourth Entity, FifthEntity. 的实体,我们还假设我在每个实体中有两个名为 firstAttribute, secondAttribute 的属性。我进入 xcdatamold 打开编辑器,然后选择为我的所有实体创建 NSManagedObject 子类。然后我想实例化每个新的 NSManagedObject 子类,这样我就可以访问 FirstEntity 中的属性。所以我写了这段代码:

let firstEntity = FirstEntity()

然后当我 运行 应用程序崩溃时,所以我根据 Whosebug post 的提示进一步编辑它,现在这是我的代码:

let firstEntityName = NSEntityDescription.entityForName("FirstEntity", inManagedObjectContext: managedObject)

let firstEntity = FirstEntity.init(entity: firstEntity!, insertIntoManagedObjectContext: managedObject)

但是,我的代码仍然崩溃。我真的很无能,因为所有与该问题相关的堆栈溢出 posts 都说要执行上述操作,但我的代码 still 崩溃无法调用 NSManagedObject 上的指定初始化程序 Class 错误。

有什么建议吗?

您不应通过初始化程序自行创建托管对象。相反,您调用 NSEntityDescription 的 insertNewObjectForEntityForName:inManagedObjectContext: 函数。沿着:

let firstEntity = NSEntityDescription.insertNewObjectForEntityForName("FirstEntity", inManagedObjectContext: managedObject)

上面将firstEntity设置为NSManagedObject的一个实例。假设您已经通过 Interface Builder 创建了 NSManagedObject 的 FirstEntity 子类,您可以改为使用:

let firstEntity = NSEntityDescription.insertNewObjectForEntityForName("FirstEntity", inManagedObjectContext: managedObject) as! FirstEntity
firstEntity.firstAttribute = // Whatever

最简单的方法是这样的:

  • 在应用程序中定义委托上下文的引用
  • 通过传递上下文实例化变量

在 AppDelegate 中(括号外):

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

在代码中:

let firstEntity = FirstEntity(context:context)

现在您已经创建了您的实体。但不要忘记保存:

appDelegate.saveContext()