调用 NSArrayController 的 add 的 NSManagedObject 类调用指定初始化程序失败

Posted

技术标签:

【中文标题】调用 NSArrayController 的 add 的 NSManagedObject 类调用指定初始化程序失败【英文标题】:Failed to call designated initializer on NSManagedObject class calling NSArrayController's add 【发布时间】:2017-02-03 09:05:13 【问题描述】:

我有两个类 A 和 B,从 A 到 n B 的关系是 1:n。 A中有关系属性bs(无序),B中有a关系属性。

A 和 B 实际上是 NSManagedObject 从项目的核心数据模型中自动生成的。

在 NSViewController 中,我有一个 ArrayController 和一个基于单元格的 NSTableView,我需要通过它来显示和管理 b。

ArrayController 有:

    模式:类 类名:B 内容集绑定到 a.bs

表格的每一列都绑定到Array Controller 的arrayObjects.b_attribute

表格按预期显示了 b,我可以对其进行编辑。

尝试添加新 b 时出现问题。

控制器有一个按钮,其动作绑定到Array Controller add: 方法。

不幸的是,当我按下按钮时,出现以下错误:

error: CoreData: error: Failed to call designated initializer 
on NSManagedObject class 'B'

CoreData: error: CoreData: error: Failed to call designated 
initializer on NSManagedObject class 'B'

挖掘 *** 我发现问题可能与使用以下方法创建托管对象有关:

... = [[B alloc] init];

而不是

... = [NSEntityDescription insertNewObjectForEntityForName:@"B" inManagedObjectContext:_managedObjectContext];

由于我没有显式创建 b 对象,我认为情况并非如此,但我无法弄清楚我做错了什么。

提前感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

设置 ArrayController:

模式:实体名称

实体名称:B

准备内容:是

【讨论】:

不幸的是,这并不能解决问题。无论如何,谢谢。 阵列控制器的模式是否设置为“实体名称”?【参考方案2】:

我将这个问题整理如下:

    ArrayController 作为 bsController 链接到代码中

    按钮启动添加新B的方法:

    (IBAction)newB:(NSButton *)sender

    B *b = [NSEntityDescription insertNewObjectForEntityForName:@"B" inManagedObjectContext:_managedObjectContext];

    [_bsController addObject:b];

它可以正常工作,在表格中正确创建一个空行。

【讨论】:

以上是关于调用 NSArrayController 的 add 的 NSManagedObject 类调用指定初始化程序失败的主要内容,如果未能解决你的问题,请参考以下文章

调用 NSArrayController 的 add 的 NSManagedObject 类调用指定初始化程序失败

如何将 NSArrayController 的内容集绑定到多个 NSArrayController 选择?

两个 NSArrayController 和一个关系(CoreData)

NSArrayController 的奇怪行为

NSTableView 绑定到 NSArrayController

过滤 NSArrayController 的问题