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中的所有子视图?

Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue

如何让文本在可滚动的 UILabel 中居中?

UICollectionViewCell与UIScrollView取消didSelectItemAtIndexPath