如何以可重用的方式修改NSManagedObject类的行为,可以在Bindings中访问?

时间:2011-05-02 19:02:55

标签: macos core-data interface-builder cocoa-bindings

Xcode自动为您的NSMO实体生成类实现 - 很棒。

但我们经常需要定制它们。如果您忘记自定义了这些文件,Xcode将很乐意“删除”(覆盖)并删除所有代码。

所以...一个经典的伎俩是:

  1. 在Apple的模型视图中创建NSManagedObject
  2. 生成课程
  3. 创建使用Categories来扩展原始类的新类,添加修改后的行为
  4. 导入custom-category-headers而不是基本NSMO标头,从而获得“新”行为
  5. 这很好用:将自定义代码放在类别中,当您使用Xcode自动生成文件时,您永远不会丢失任何内容。

    但是......现在我正在使用Bindings / Mac OS代码,并且Bindings很棒,但我不知道如何使绑定“导入”派生头(带有类别,以及修改后的方法/自定义)行为)?

    e.g。如果我有一个持有NSMO实例的ArrayController(很常见),你通常会告诉它“实体名称”(例如“MyCoreDataEntity”),它会向NSMO请求该类名。但是这永远不会加载该类别,所以它永远不会拿起该类的自定义版本。

    你如何解决这个问题?要么:如何加载类的类别版本?

    或者:如何在不使用类别的情况下编写自定义代码,并在感觉到时删除所有代码?

2 个答案:

答案 0 :(得分:0)

我必须承认,因为我使用cocoa touch没有绑定可用 - 所以我真的不知道我的建议是否适用于你的情况。

但是,这可能有帮助吗?

核心数据添加的类别有一种替代方案 - 不像类别那样“复杂” - 我知道。

可以使用#include语句:

有两种选择:

  1. 创建一个新的ClassFile,删除include“header.h”,(删除header.h),将额外的代码放在那里。它编译但带来两个警告:(这是可以理解的)[WARN]警告:没有规则来处理文件'$(PROJECT_DIR)/ Classes /../ included_dataStuff'的文本类型为架构armv6 [WARN]警告:没有规则架构armv7的文本类型文本'$(PROJECT_DIR)/ Classes /../ included_dataStuff'

  2. 创建一个新的“空”文件并将额外的代码放在那里。这不会产生任何警告。

  3. 1和2之间的区别在于,虽然代码格式保留在第一个交替中(必须接受2个警告),但是所有代码格式都丢失了,并将其视为普通文本(但没有警告)

    我想我更喜欢第一个。当然,对生成的代码文件的唯一修改是#include语句。

答案 1 :(得分:0)

最简单的解决方案是子类NSArrayController,导入类别,然后在IB中使用子类。这样你的绑定应该自动知道类别。

MoGenerator过去擅长生成自定义类,而不必覆盖任何内容。因为原作者似乎没有时间这样做,我正在为Xcode 4.x修改它或类似的东西。