2012-07-24 65 views
0

因此,我最近致力于扩展List/Details应用程序模式的功能:在Details视图上实施轻扫以移至父列表中的上一个或下一个项目。在Cocoa中重用非平凡代码的机制?

我的解决方案需要在Details视图中添加一个属性,在List视图中添加3个属性,在每个属性中实现几个新的函数,并确保某些代码在ViewDidLoad中运行,并且表视图的DidSelect方法。

我一直在寻找Cocoa和XCode 4中重复使用(snippets,subclassing和categories)的显而易见的机制,以便使这些代码(这几乎是独立的)更容易添加到其他屏幕中和应用程序,并没有看起来适合它。我找不出任何可以封装所有必要更改的机制,或简化其他屏幕或项目的代码重用。

下面是特定的短缺憾:

片段:只能插入一个单一的代码块,所以不适合用于需要在同一个文件中的多个文件的变化,或甚至多个点的代码。

类别:可以添加新方法(或重新定义现有方法),但不能添加新属性。

子类化:可以添加新的方法和属性,但不涉及跨多个类的变化来实现解决方案。

可以使用混合方法(使用片段,类别和子类),但是没有机制将这些代码修改打包在一起!

即使它们来自其他语言或IDE,但了解其他地方使用的任何方法也会很有趣。

感谢

回答

1

类别一般可以通过associated references添加属性。这是解决各种问题的好办法。


编辑:如果你只是想一些对象有特殊的行为,你知道,他们在创建时,你控制自己的创作,那么这听起来像子类。如果您希望特定实例具有特殊行为,并且您不控制它们的创建,或者您不知道在创建它们时需要这些行为,那么有一种工具可以实现这一点。这就是所谓的ISA混合,这是如何实施KVO。

iOS:PTL的第20章涵盖了这一点,但如果您想要一些示例代码来说明它是如何完成的,请参阅ISASwizzle示例代码。 Robbie Hanson也有该主题的short, accessible discussion。这是一项相当先进的技术,应该小心使用,但功能非常强大。

+0

一个分类不适用于超类。但是,如果您已经创建了自定义子类,那么创建一个类别似乎有点多余。我试图描绘这种情况。 – 2012-07-26 00:05:12

+0

您不应该使用类别来替换方法。在许多常见情况下,这是未定义的行为。类别只能用于添加新方法。 – 2012-07-26 00:49:32

+0

对不起,但你的答案缺少问题的关键。我试图找出可以重复使用需要跨多个类/文件进行逻辑的解决方案的机制,这些机制似乎不受片段,类别或子类别的支持。 – 2012-07-26 15:26:45