“[copy copyWithZone:]:无法识别的选择器发送到实例时”使用Bindings / Core Data时

时间:2011-07-10 23:47:58

标签: cocoa core-data cocoa-bindings nsmanagedobject

(自我询问和自我回答,因为我花了几个小时在网上寻找这个,大部分资源都说“我最终解决了它”而没有给出解释)

我有一个非常简单的Core Data + Bindings应用程序:

  • NSArrayController从Core Data中提取项目
  • NSTableView呈现它们
  • 另一个NSTableView,当您单击第一个表中的行时,显示该项的详细信息

上面的第3项导致应用程序崩溃,错误:

[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance

实现该方法(!)并在那里放置一个断点,我发现它是由Apple的NSCell类调用的 - 这没有多大帮助:(。

8 个答案:

答案 0 :(得分:25)

结果证明以上所有都需要触发这一点,而XCode允许你在99.9%的情况下做错事,如果不是100%的话。

  1. 核心数据对象无法实现copyWithZone: - 这会导致崩溃

  2. 使用Bindings填充tableview时,它会尝试复制NSArrayController中对象的以呈现每个列

  3. ...但如果您未能完全指定Column绑定(Xcode允许您指定一半),则tableview会尝试对象上的“复制”而不是< EM>值

  4. 我的绑定中的错误:我已经指定表列的“值”为:

      

    Controller Key =“arrangeObjects”   模型关键路径=(空白)

    (这是XCode4自动完成中的一个错误 - 当你过快地删除时,它会删除ModelKeyPath字段)

    完成输入绑定,例如:

      

    Model Key Path =“value”

    ......一切都恢复了。

答案 1 :(得分:8)

我还想在这里发帖,因为我有类似问题的类似问题

清空定义的对象:

错误的代码:

@property (nonatomic, copy, readwrite) MSender * sender;

这应该引发编译错误,因为引用计数Xcode不知道如何复制我的对象。相反,它在运行时失败了......

编写代码:

@property (nonatomic, strong, readwrite) MSender * sender;

希望它有所帮助。

答案 2 :(得分:6)

感谢您提供此解决方案,它指出了我正确的方向。对于那些学习 InterfaceBuilder 的人,我希望这些附加信息有所帮助。

在构建教程时,我无意中将Text field Cell - Text Cell绑定到ArrayController.ObjectValue。 真正的绑定应该发生在

Table Column > Table Cell View > Static Text - Table View Cell

那个是正确的,但在视觉上在它下面的树中(由于我不理解的原因,IB需要Text Field Cell。)我绑定了:

Table Column > Text Field Cell - Text Cell

第二个绑定尝试复制整个对象,因为路径为objectValue没有键,它触发了这个错误。

可能是一个新手的错误,但这意味着走过每个对象并检查绑定,我遇到了这个一个

答案 3 :(得分:3)

作为避免绑定出现任何问题的提示,可以将NSManagedObject转换为NSDictionary,同时使用:[object dictionaryWithValuesForKeys:[[object entity] attributeKeys]]填充控制器,连接和连接更容易debug: - )

顺便感谢指针!

答案 4 :(得分:1)

当我尝试实现主 - 详细信息绑定时遇到此错误。类似于部门/员工的东西。我试图将一个arrayController绑定到Department的“selection.employees”并得到:

  

- [Employee copyWithZone:]:无法识别的选择器发送到实例

原来,员工之间的关系并没有像预期的那样达到目标,而是达到了一致。一旦我纠正了这一点,一切都很好。

答案 5 :(得分:0)

我也有类似的问题,它来自调用ProxyObject而不是来自数组控制器的实际对象。

例如:

MYEntity *entity = EntityController.selection;
NSString *property = entity.property;   // <--- causes the error

MYEntity *entity = EntityController.selectedObjects firstObject]; // <--- fixes the error
NSString *property = entity.property;   

答案 6 :(得分:0)

意外地面对这个问题。

经过一番调查后,我发现原因是NSTextField上设置的cocoa绑定选项错误 - 单元格对象。

enter image description here

enter image description here

通过关闭绑定来解决问题。

答案 7 :(得分:0)

当我从NSTableViewDataSource函数-tableView:objectValueForTableColumn:row:返回一个视图时,我得到了这个。相反,它应该返回一个值(例如NSString*)。 (鉴于它的名字,这并不奇怪,但是错误对于发现它没有帮助。我想到的函数是-tableView:viewForTableColumn:row:中的NSTableViewDelegate。)