呈现和关闭模式视图控制器时如何保持选择集合视图单元格?

Posted

技术标签:

【中文标题】呈现和关闭模式视图控制器时如何保持选择集合视图单元格?【英文标题】:How to keep collection view cell selected when presenting and dismissing modal view controller? 【发布时间】:2018-08-10 19:08:43 【问题描述】:

我有一个UICollectionViewController,它也可以作为UICollectionViewDelegateFlowLayout 来调整单元格的大小。一个单元格选择模态地呈现一些自定义控件,然后在完成后返回,但是当重新出现时,所选单元格不再被选中。

我看到 collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 的委托方法被调用,但不是 collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)。我还看到布局被要求提供首选单元格大小,所以我认为它们正在重绘,但单元格已经存在。

我可以通过调用relaodData() 来解决问题,并且单元格知道它已被选中,并相应地重新绘制,但这似乎是一个昂贵且错误的解决方案。关于我所缺少的任何建议?谢谢。

【问题讨论】:

【参考方案1】:

以下委托方法的默认实现取消选择单元格。

在不调用 super 的情况下覆盖它:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

【讨论】:

我重写了这个函数,以模态方式呈现最终导致问题的视图控制器。因此,如果我将实现留空,则永远不会出现有问题的视图控制器。 Is there a better method than this one to present a view controller when a certain cell is selected? @Yarn,我的意思是不要叫 super,我会修改我的答案。【参考方案2】:

collectionView(_collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 被调用,但不是collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)

【讨论】:

您能提供一些上下文并使用代码块吗?【参考方案3】:

我看到 collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 的委托方法被调用,但没有调用 collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath)。我还看到布局被要求提供首选单元格大小,所以我认为它们正在重绘,但单元格已经存在。

【讨论】:

【参考方案4】:

想通了。

UICollectionViewController 具有自动设置为 true 的属性 clearsSelectionOnViewWillAppear

我所要做的就是将其设置为 false。

【讨论】:

以上是关于呈现和关闭模式视图控制器时如何保持选择集合视图单元格?的主要内容,如果未能解决你的问题,请参考以下文章

关闭表格视图控制器上方的模态显示视图控制器时,如何从表格视图控制器中取消选择行?

如果存在多个视图控制器,如何关闭模式视图控制器

在关闭另一个模式视图控制器后呈现一个模式视图控制器

设备方向更改时如何重新排列集合视图单元格

通过模态视图呈现详细视图控制器 [关闭]

在应用程序退出时关闭模式视图控制器