跨多个 UICollectionViewController 重用 UICollectionView

Posted

技术标签:

【中文标题】跨多个 UICollectionViewController 重用 UICollectionView【英文标题】:Reuse UICollectionView across multiple UICollectionViewControllers 【发布时间】:2017-06-02 22:03:48 【问题描述】:

我有一个表格视图,其中每一行都包含一个 collectionView。每个collectionView只有一行高并且水平滚动。所以,如果你能想象,我有几个水平滚动的轮播,它们相互堆叠。

我已经看过一些关于这种布局的教程,它们都有一个 UIViewController,它是 UITableView 和所有 UICollectionViews 的数据源和委托。这允许 viewController 重用 tableView 单元格和其中的 collectionViews。

由于其他一些代码重用考虑,我想以不同的方式构建我的代码。我想有一个 UITableViewController 来管理表格,然后有 UICollectionViewControllers 来管理每个集合视图。这确实有效,但是因为 UICollectionViewController 包含它自己的 UICollectionView,所以当用户滚动显示不同轮播的表格时,我无法重用 collectionViews。

最后我的问题是,您能否注入或替换 UICollectionViewController 使用的 collectionView,以便我可以跨多个视图控制器重用视图。

【问题讨论】:

【参考方案1】:

好吧,我想我已经完成了您的要求。你想要像 AppStore 一样的东西。

让我描述一下我所做的事情,我创建了一个自定义 tableViewCell,它的属性为 collectionView,来自我的 tableViewController,我发送我的自定义 tableViewCell。现在重要的部分是,collectionView 呢?所以我想如果我们将collectionViewdataSourcedelegate 设置为tableViewCell 会怎样?它会单独处理所有事情。我创建了我的tableViewCell 的一些delegate 方法来处理didSelectcollectionView 的其他事件。这样你就不需要collectionViewController,只需要tableViewController 和自定义tableViewCell 就可以了。

如果它让您感到困惑或需要任何示例代码,请告诉我(如果您愿意,我稍后会添加)

编辑

忘了提到你不能将collectionViewControllercollectionView 注入另一个collectionView

此外,为了重用您的代码,您可以创建一个类,让我们调用 CollectionViewHandler 并将数据源和委托方法添加到该类,并将该类的实例分配给单独的 collectionView 用于数据源和委托。在这里使用collectionViewController 不适合您的情况。

【讨论】:

【参考方案2】:

不,我认为你不能。视图只能属于单个超级视图。

就此而言,如果您有一个管理多个集合视图的视图控制器,则每个集合视图都有自己的单元队列以供重用。您将dequeueReusableCell(withReuseIdentifier:for:) 发送到特定的集合视图,每个视图都维护一个单独的重用队列。

为什么您认为需要共享所有单元格、所有集合视图中的视图?单元格点重用它以避免滚动时“流失”。通过单元格重用,您一次达到屏幕上最大单元格数量的“高水位线”,当您滚动时,滚动到屏幕外的单元格被重用以在集合中的其他 indexPath 位置显示新数据.

在我看来,您正在寻求解决一个不存在的问题。

你说:

我已经看过一些关于这种布局的教程,它们都有 一个 UIViewController,它是数据源和委托 UITableView 和所有 UICollectionViews。这允许 viewController 重用 tableView 单元格和里面的 collectionViews 他们。

这是不对的。每个集合视图都有一个单独的单元队列来回收。单元格不会从一个集合视图跨到另一个集合视图。

【讨论】:

抱歉,我认为我的解释不正确。我不想只有一个 UICollectionViewController。这是一个示例:我有 1 个包含 20 行的表。每行包含一个可水平滚动的collectionView(轮播)。在任何时候,屏幕上都只能看到 4 个 collectionView。所以我想要 4 个 collectionViews 但 20 个 UICollectionViewControllers(每个都维护相关行的数据和状态)。当一行在屏幕上滚动时,我想从重用的 tableView 单元格中获取 collectionView 并将其注入该行的 UICollectionViewController 中。

以上是关于跨多个 UICollectionViewController 重用 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

Angular - 跨多个模块使用组件

跨多个磁盘传播mysql数据

跨多个索引的多个字段上的 Elasticsearch 聚合

Azure 网站可以跨多个可用区扩展吗

是否可以跨多个视图维护 UIButtons?

跨多个数据中心使用 etcd 是不是安全?