跨多个 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
呢?所以我想如果我们将collectionView
的dataSource
和delegate
设置为tableViewCell
会怎样?它会单独处理所有事情。我创建了我的tableViewCell
的一些delegate
方法来处理didSelect
和collectionView
的其他事件。这样你就不需要collectionViewController
,只需要tableViewController
和自定义tableViewCell
就可以了。
如果它让您感到困惑或需要任何示例代码,请告诉我(如果您愿意,我稍后会添加)
编辑
忘了提到你不能将collectionViewController
的collectionView
注入另一个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的主要内容,如果未能解决你的问题,请参考以下文章