在UITableView和UICollectionView之间共享代码

时间:2013-12-02 16:18:20

标签: objective-c cocoa-touch uitableview uiview uicollectionview

我的iPad和iPhone界面分别使用UICollectionViewUITableView。在每种情况下,都有很多共性:

  • 每个部分具有相同数量的部分(硬编码)
  • 每个部分具有相同数量的相应行/项(源自相同数据源)
  • 每个都具有相同的单元格内容(这些是使用自动布局构建的自定义视图,因此适用于这两种情况)
  • 每个都有相同的部分页眉和页脚(同样,自定义内容)
  • 每个人都可以以相同的方式响应某些通知(例如,当收到新数据时,刷新数据源)但也使用自定义部分(重新加载UITableView vs重新加载UICollectionView
  • 每个将通过单元格选择呈现相同的控制器,但UITableView将推送新控制器,UICollectionView将使用弹出窗口。

我正在使用共享父类来满足其中一些需求。这种方法似乎特别适合数据要求 - 父类构建数据并负责维护数据。我使用两个子类来呈现数据 - 一个带有UITableView,另一个带有UICollectionView。

演示方面不太干净。举一个最简单的例子,当表/集合视图需要知道节的数量时,在每种情况下我都依赖于父节点中的自定义方法:

return [super sectionsCount]

这允许我只设置一次多个值并更新两个视图。

然后是最贫困的部分。同样,为简化起见,请考虑第一部分的标题视图。在这两种情况下,这应该是相同的。我有一个我想要使用的自定义UIView子类,其中有几个属性设置相同。这里的问题是表视图部分的可重用头部需要UITableViewHeaderFooterView,而集合视图的对应部分需要UICollectionReusableView。所以为了适应这个,我必须创建这些子类只是为了保存我想要的标题视图。总结如下:

我想要的是:UITableView和UICollectionView应该使用与节的标题相同的UIView子类。在每种情况下,应该相同地设置该视图的自定义属性。

我必须做的事情:

  • 为标题构建所需的UIView子类。
  • 构建一个包含一个此类标头的UITableViewHeaderFooterView子类。它的init只是添加标题视图。
  • 构建一个UICollectionReusableView子类,除了添加标题视图之外,它只能做什么。
  • 当集合视图需要标头时,请创建UITableViewHeaderFooterView子类的实例。设置其属性。
  • 当表视图需要标题时,创建UITableViewHeaderFooterView子类的实例。设置其属性。

一旦我必须为页脚,特别是细胞做这件事,事情变得有点蠢。我有三次我需要的类,我正在重复我的所有代码来设置视图的自定义属性。

如何在UICollectionViewUITableView之间最好地重复使用此逻辑?

1 个答案:

答案 0 :(得分:1)

您只需创建广告资源UICollectionReusableViewsUITableViewHeaderFooterViews等,然后将自定义视图添加为子视图。如果您稍后需要访问自定义视图,则可以设置其tag属性并使用[view viewWithTag:]