【问题标题】:"[something copyWithZone:]: unrecognized selector sent to instance" when using Bindings / Core Data“[something copyWithZone:]: unrecognized selector sent to instance”使用绑定/核心数据时
【发布时间】:2011-10-02 10:31:10
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: cocoa core-data cocoa-bindings nsmanagedobject


    【解决方案1】:

    事实证明,触发此事件需要以上所有条件,而 XCode 允许您在 99.9% 的情况下(如果不是 100% 的话)做错事。

    1. Core-Data 对象不能实现 copyWithZone: - 这会导致崩溃

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

    3. ...但是如果您没有完全指定 Column 绑定(Xcode 允许您指定一半),那么 tableview 会尝试在 objects 上“复制”而不是它们的 价值观

    我的绑定中的错误:我已经指定一个表列有一个“值”:

    控制器键 = "arrangedObjects" 模型键路径 =(空白)

    (这是 XCode4 自动完成中的一个错误 - 有时当您太快退出时,它会删除 ModelKeyPath 字段)

    完成输入绑定,例如:

    模型键路径 = "值"

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

    【讨论】:

    • 当您在检查器的文本字段中并点击运行时,有时 Interface Builder 似乎不会自动保存更改。该字段(例如,模型键路径)似乎设置,但实际上并非如此。
    【解决方案2】:

    感谢您的解决方案,它为我指明了正确的方向。对于那些学习 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,没有键,它触发了这个错误。

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

    【讨论】:

    • 新手错误...但是可视化 UI 构建器的想法是让事情变得更容易,而不是更难...感谢您的描述,原来我犯了同样的错误
    【解决方案3】:

    我也想在这里发帖,因为我对同一类型的东西也有类似的问题

    空定义对象:

    错误代码:

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

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

    编写代码:

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

    希望对某人有所帮助。

    【讨论】:

    • 干杯 - 这解决了我一直在寻找一天的错误! :))
    • 干杯 :-D 也解决了我的问题!
    • 大减号。这在某些情况下是行不通的。至少在我的情况下,当我尝试将在自动释放的子上下文中创建的对象保存在此类变量中时,它会出现(我没有尝试主上下文,因为它似乎只在主线程中工作)。否则,似乎会出现以下情况:经过一段时间,此对象变为 nil。
    【解决方案4】:

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

    顺便谢谢指点!

    【讨论】:

      【解决方案5】:

      我也遇到了类似的问题,它来自于调用 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】:

        偶然遇到这个问题。

        经过一番调查,我发现原因是在NSTextField-cell 对象上设置了错误的可可绑定选项。

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我在尝试实现主从绑定时遇到了这个错误。类似于部门/员工的东西。我尝试将 arrayController 绑定到 Department 的“selection.employees”并得到:

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

            事实证明,员工关系并未按预期设置为多对多,而是一对一。一旦我纠正了这一点,一切都很好。

            【讨论】:

            • 谢谢。这是我遇到的问题,我自己永远也想不通。
            猜你喜欢
            • 2011-08-25
            • 1970-01-01
            • 1970-01-01
            • 2017-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多