【问题标题】:Failed to call designated initializer on NSManagedObject class calling NSArrayController's add调用 NSArrayController 的 add 的 NSManagedObject 类调用指定初始化程序失败
【发布时间】: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 有:

  1. 模式:类
  2. 类名:B
  3. 内容集绑定到 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'

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

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

而不是

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

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

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

【问题讨论】:

    标签: macos cocoa core-data cocoa-bindings nsarraycontroller


    【解决方案1】:

    设置 ArrayController:

    模式:实体名称

    实体名称:B

    准备内容:是

    【讨论】:

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

    我将这个问题整理如下:

    1. ArrayController 作为 bsController 链接到代码中
    2. 按钮启动添加新B的方法:

      • (IBAction)newB:(NSButton *)sender {

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

      [_bsController addObject:b]; }

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2014-10-19
      • 2016-01-22
      • 2013-01-18
      相关资源
      最近更新 更多