未能在 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()
我真的被这个问题困住了,我已经参考了
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()