如何以可在绑定中访问的可重用方式修改 NSManagedObject 类的行为?
Posted
技术标签:
【中文标题】如何以可在绑定中访问的可重用方式修改 NSManagedObject 类的行为?【英文标题】:How to modify behaviour of NSManagedObject class in reusable way which can be accessed in Bindings? 【发布时间】:2011-05-02 19:02:55 【问题描述】:Xcode 为您的 NSMO 实体自动生成类实现 - 很棒。
但我们经常需要自定义它们。如果您忘记自定义这些文件,Xcode 会很高兴地“删除”(覆盖)并移除您的所有代码。
所以...一个经典的技巧是:
-
在 Apple 的模型视图中创建 NSManagedObject
生成类
创建使用类别扩展原始类的新类,添加修改后的行为
导入 custom-category-headers 而不是基本 NSMO 标头,从而获得“新”行为
这很好用:将自定义代码放在类别中,当您使用 Xcode 自动生成文件时,您永远不会丢失任何东西。
但是...现在我正在使用 Bindings / Mac OS 代码,并且 Bindings 很棒,但我不知道如何使 Binding “导入”派生标头(带有类别和修改后的方法 / 自定义行为)?
例如如果我有一个保存 NSMO 实例的 ArrayController(非常常见),您通常会告诉它“实体名称”(例如“MyCoreDataEntity”),它会使用该类名称请求 NSMO。但这永远不会加载类别,因此它永远不会选择该类的自定义版本。
你如何解决这个问题?要么:如何加载类的类别版本?
或者:如何在不使用类别的情况下编写自定义代码并避免 Xcode 在需要时删除所有代码?
【问题讨论】:
【参考方案1】:我必须承认,因为我使用的是 cocoa touch,所以没有可用的绑定 - 所以我真的不知道我的建议是否适用于你的情况。
但是,也许这有帮助?
对于添加核心数据的类别有另一种选择 - 不像类别那样“复杂” - 我知道。
可以使用#include 语句:
有两种选择:
新建一个ClassFile,删除include“header.h”,(删除header.h),把多余的代码放在那里。它编译但带来了两个警告:(这是可以理解的)[WARN]警告:没有规则来处理架构armv6文本类型的文件'$(PROJECT_DIR)/Classes/../included_dataStuff' [WARN]警告:没有规则为架构 armv7 处理文本类型的文件“$(PROJECT_DIR)/Classes/../included_dataStuff”
创建一个新的“空”文件并将额外的代码放在那里。这不会产生任何警告。
1 和 2 之间的区别在于,虽然代码格式保留在第一个替代项中(必须接受 2 个警告),但在第二个中,所有代码格式都丢失了,它被视为普通文本(但没有警告)
我想我更喜欢第一个。当然,对生成的代码文件的唯一修改是#include 语句。
【讨论】:
所以……每次重新生成代码,一定要记得手动编辑并#include包含自定义代码的文件? 是的,到目前为止我就是这样做的。但是,我正在研究预操作或任何其他方式来在编译开始之前添加我自己的小预处理。这样我可以为自己节省很多工作,因为可以添加更多的自动化任务。您是否有机会知道这是否可以使用 xCode4 中的预操作来完成?【参考方案2】:最简单的解决方案是继承 NSArrayController,导入类别,然后在 IB 中使用子类。这样你的绑定应该自动知道类别。
MoGenerator 过去擅长生成自定义类而无需覆盖任何内容。我正在为 Xcode 4.x 更新它或类似的东西,因为原始作者似乎没有时间这样做。
【讨论】:
这很狡猾,好主意。回复:Xcode4——我的猜测是,Apple 将“最终”添加体面的 CoreData 支持......他们已经删除了 Xcode3 的一些核心功能,并且没有提供替代品,这表明他们有一些“更好”的计划。不过可能需要一段时间......以上是关于如何以可在绑定中访问的可重用方式修改 NSManagedObject 类的行为?的主要内容,如果未能解决你的问题,请参考以下文章