带有 UICollectionView 的基础 UIViewController
Posted
技术标签:
【中文标题】带有 UICollectionView 的基础 UIViewController【英文标题】:Base UIViewController with UICollectionView 【发布时间】:2015-06-09 17:08:34 【问题描述】:我有 UIViewController,我想将它用作其他视图控制器的基本控制器。基本控制器有一个 UICollectionView,它具有所有 UICollectionViewCell 原型和故事板中设计的一些其他存根视图。
所有的子视图控制器都有一个共同点,那就是 UICollectionView,并且在故事板中有自己的视图。我想使用在基本视图控制器的集合视图中设计的原型单元来填充子视图控制器的 UICollectionView。我不想将粘贴原型单元格从基本控制器的集合视图复制到子控制器集合视图。
基本控制器对单元格选择执行一些操作,这些操作对所有子控制器都是通用的。子控制器应该能够从基本控制器请求任何原型单元,子控制器将使用单元标识符来决定填充哪个单元。
我应该能够使用它们的故事板标识符来实例化子控制器而不是基本控制器。我想在故事板中做最大的事情。 如何做到这一点?请提出建议或任何其他更好的方法。
我正在使用 Objective-C 编程。
【问题讨论】:
【参考方案1】:经过大量挖掘后,我发现无法重用原型 UICollectionViewCell,因此我最终为每个集合视图单元格创建了单独的 XIB。 这就是我所做的:
为集合视图单元格创建了 XIB。
编写了一个基类 BaseViewController,它在其 .h 文件中声明了一个 UICollectionView IBOutlet。 BaseViewController 类确认 UICollectionViewDelegate 和 UICollectionViewDataSource 协议。
2.1 在 BaseViewController viewDidLoad 方法中,将所有单元格 XIB 注册到 UICollectionView。
2.2 实现了处理通用事件的委托和数据源方法。如果需要,子类可以覆盖这些方法并执行特定任务。
在情节提要中创建具有 UICollectionView 的子视图控制器。 3.1 将UICollectionView连接到.h文件中定义的super的UICollectionView IBOutlet。
现在一切都完成了!现在我可以将在 super 中注册的任何单元格出列,或者如果子视图控制器想要一些特定的单元格,它可以在故事板中自己的 UICollectionView 中对它们进行原型制作并完成工作。 在我的情况下,大多数时候 didSelectItem 在基类中执行一些通用操作,这些操作对所有子视图控制器都是通用的,所以我只是不实现它,或者如果除了通用操作之外还想执行一些其他操作,我实现该方法并调用 super 的实施,然后做我的事情。所有单元格大小和布局相关的方法都由基本视图控制器实现。现在我可以用最少的代码和正确的事件处理创建一个带有集合视图的新子视图控制器。
希望这对某人有所帮助。谢谢。
【讨论】:
我的问题与性能无关,而是与代码结构和事件处理有关。上面的答案为我节省了很多时间,因为我没有在故事板的 collectionView 中创建任何原型单元格,也没有处理我的 childViewController 中具有 collectionView 的任何与大小相关的东西。在任何时候我必须对任何 collectionViewCell 进行更改,我都会去它的 XIB 并更改它。与此相反,如果我在所有 collectionView 中复制粘贴的原型单元格,我必须逐个更改它们。以上是关于带有 UICollectionView 的基础 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
带有 endItemAnimations 的 UICollectionView 中的断言失败