我意识到这是一个过于宽泛的问题,但我发现我的Objective-C代码是高度重复的。我认为新的块功能会有所帮助,但我还不能假设我的所有用户都在iOS 4上。
我经常最终得到两个或三个具有许多类似逻辑的控制器。我确实将这个逻辑中的一部分引入了一个公共基类,但是,特别是对于与委托相关的代码,我发现在几个不同的地方出现了非常相似的逻辑,因为它们存在细微差别。
例如,如果我有一个UITableViewController并且我有几个使用多个相同行的子类,那么我几乎无法继承。如果一个子类添加了一个额外的行(或者多个行和/或如果它们位于表的中间而不是末尾),则索引会中断并且超类中的大多数委托方法不再起作用 - 我必须在子类中重新实现它们。
再一次,我意识到这是模糊的,但人们必须采用什么样的模式来解决这个问题呢?
谢谢!
答案 0 :(得分:3)
您正在使用/思考错误的设计模式。
Objective-C专门使用Delegate设计模式来避免子类的扩散。属性和相同的方法进入类或有限的子类,而每个用户自定义的方法进入委托类。
例如,UITableView类仅关注每个表共有的所有属性和方法。所有自定义都在委托和数据源(它只是另一个委托)对象中进行。 UITableViewController将所有内容绑定到逻辑视图层次结构中。
如果您发现自己拥有大量类似的表,则应创建委托/数据源类的层次结构来处理更改。
请记住,让UITableViewController成为委托和数据源对象只是方便而不是要求。委托和数据源可以在一个或两个单独的对象中,这些对象本身可以在一个或多个类中。
特别是高度定制的表格。每个表处理在不同单元格中以不同顺序显示的不同数据。这意味着真的没有办法逃避编写相对大量的自定义代码。
如果子类添加了另一行 (或多行和/或如果他们在 桌子的中间而不是 结束),索引中断和最多 的委托方法 超类不再工作
这听起来像是你将模型逻辑放在tableView委托/数据源中。不应仅仅因为添加/删除行或部分而重写代理。行和部分的逻辑应该在模型对象中,例如核心数据,代表应该只关心将模型的逻辑行和部分转换为tableview中的行和部分。在绝大多数情况下,这种翻译可以通过样板来完成。任何给定的委托应该能够使用相同的代码显示和任意数量的不同逻辑表。
唯一真正的定制点通常是tableview单元格。即便如此,您最多只关注每张桌子的一些变化。
使用Core Data查看Xcode模板tableview项目。它可以显示大量表而不更改任何代码,因为所有更改都发生在Core Data模型层中。