使用 UICollectionView 的基础 UIViewController

Base UIViewController with UICollectionView

我有 UIViewController,我想将它用作其他视图控制器的基本控制器。基本控制器有一个 UICollectionView,它有所有的 UICollectionViewCell 原型和故事板中设计的一些其他存根视图。

所有的子视图控制器都有一个共同点,那就是 UICollectionView 并且在情节提要中有自己的视图。我想使用在基本视图控制器的集合视图中设计的原型单元来填充子视图控制器的 UICollectionView。我不想将粘贴原型单元格从基本控制器的集合视图复制到子控制器集合视图。

基础控制器执行一些对所有子控制器通用的单元格选择操作。子控制器应该能够从基本控制器请求任何原型单元,子控制器将使用单元标识符决定填充哪个单元。

我应该能够使用故事板标识符实例化子控制器而不是基础控制器。我想在情节提要中做最多的事情。 这是如何实现的?请提出建议或任何其他更好的方法。

我在Objective-C编程。

经过大量挖掘后,我发现 re-use 原型化 UICollectionViewCell 是不可能的,所以我最终为每个集合视图单元格创建了单独的 XIB。 这就是我所做的:

  1. 为集合视图单元创建了 XIB。

  2. 编写了一个基础 class BaseViewController,它在其 .h 文件中声明了一个 UICollectionView IBOutlet。 BaseViewController class 确认 UICollectionViewDelegate 和 UICollectionViewDataSource 协议。

    2.1 在BaseViewController的viewDidLoad方法中,将所有cell XIB注册到UICollectionView。

    2.2 实现了处理一般事件的委托和数据源方法。如果需要 child class 可以覆盖这些方法并执行特定任务。

  3. 在具有 UICollectionView 的故事板中创建 child 视图控制器。 3.1 将 UICollectionView 连接到 .h 文件中定义的 super 的 UICollectionView IBOutlet。

大功告成!现在我可以出列在 super 中注册的任何单元格,或者如果 child 视图控制器想要一些特定的单元格,它可以在故事板中自己的 UICollectionView 中为它们制作原型并完成工作。 在我的案例中,大多数时候 didSelectItem 在基础 class 中执行一些通用操作,这对所有 child 视图控制器都是通用的,所以我只是不实现它,或者除了通用之外还想执行一些其他操作操作 我实现方法并调用 super 的实现,然后做我的事情。所有单元格大小和布局相关的方法都由基本视图控制器实现。现在我可以用最少的代码和适当的事件处理创建一个新的 child 带有集合视图的视图控制器。

希望这对某人有所帮助。谢谢。