UICollectionViewCell 中的子视图控制器
Posted
技术标签:
【中文标题】UICollectionViewCell 中的子视图控制器【英文标题】:Child view controller in UICollectionViewCell 【发布时间】:2014-03-17 04:06:06 【问题描述】:假设我想实现 Pinterest 的 pin page,像这样:
这是我的方法:
-
创建一个
UICollectionViewController
,pin 的页面是UICollectionViewCell
cell 由两个组件组成:pin info child vc &&瀑布 child vc
那么问题来了:如何复用子视图控制器?
一些伪代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
Pin *pin = self.dataSource[indexPath.row];
// i have to create a new childVC, based on different indexPath.
UITableViewController *pinInfoViewController = [[pinInfoViewController alloc] initWithPin:pin];
[cell updatePinViewWithPin:pin];
[self addChildViewController:pinInfoViewController];
// Add waterfall view controller
每次调用这个方法都会创建一个新的子视图控制器,可以吗,或者如何改进?
【问题讨论】:
【参考方案1】:我最近遇到了类似的情况,并且在各种解决方案(如UIViewController within UICollectionView 中详述的解决方案)之间做出选择。现在似乎有一个封装了这种模式的开源项目:https://github.com/zats/Voltron。如果您的问题可能最好通过拥有 UIViewControllers 的 UICollectionView 来解决,那么它比尝试自己动手更容易完成。
【讨论】:
【参考方案2】:我处理这个问题的方法是将UICollectionViewCell
子类化,并将您需要的 UI 组件作为 iVar 添加到其中。当您需要使用新数据更新 UI 时,您可以像现在在伪代码中一样获取单元对象,然后调用您声明的方法,可以是 updateCellWithModel:
并将数据源中保存的模型传递给它。在这种方法中,您将做一些简单的检查是否创建了 UI 元素,并在需要时创建它们,在这些类型的方法中进行健全性检查总是一个好主意,但元素应该在 init 方法中创建并且将永远在那里。
编辑:我相信我回答了你的问题,但它仍然让我感到困惑,请添加更多信息,以便我可以在需要时编辑我的答案。
【讨论】:
知道了,但是如何处理按钮(如“由 XXX 添加”)事件?如果使用子 vc,可以在那里处理按钮事件。但是如果作为单元格的subView属性添加的话,应该在UICollectionViewController
中处理吧?于是一个胖控制器就诞生了。
处理视图的触摸事件是控制器职责的一部分,所以没关系。【参考方案3】:
我不认为他们在这里使用带有嵌入式表格视图的集合视图单元格。它看起来像一个专用于引脚的普通视图控制器。从服务器提取的用于该 pin 的数据可能包含有关 pin 名称、pin 链接、可能是图像、添加 pin 的所有人、原始 pinner 是谁、喜欢、收藏等信息。 ,并且视图控制器相应地解析该数据。控制器使用该数据来更新 UI,仅此而已。
我确实看到了 Pinterest 可以用于实现此视图控制器的表格视图和集合视图,但看起来他们并未将所有这些数据嵌入到集合视图单元格中。
【讨论】:
以上是关于UICollectionViewCell 中的子视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell 的子视图的宽度和高度为零
如何在 UICollectionViewCell 上设置 UILabel?
如何列出iOS中uiviewcontroller中的所有子视图?