如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格
Posted
技术标签:
【中文标题】如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格【英文标题】:UICollectionView cell can't be selected after reload in case if cell was touched during reloading 【发布时间】:2014-05-29 18:29:07 【问题描述】:我使用UICollectionView
来显示与服务器相关的信息。这个UICollectionView
允许单元格选择以显示一些嵌套数据。不幸的是,如果用户在我的应用程序调用[collectionView reloadData]
期间触摸并按住任何单元格,则此单元格不再对触摸做出反应(collectionView:didSelectItemAtIndexPath:
方法不会被调用)。
我可以选择除此之外的任何单元格。
我创建了可以重现此问题的简单应用程序:link
任何想法如何解决它?
【问题讨论】:
+1 获得漂亮的测试代码。我在自定义单元格中覆盖了 touchesBegan 和 touchesEnded ,即使不再调用 didSelectRowAtIndexPath ,它仍在接收触摸。它的superview仍然是collection view,它的frame还是一样的。到目前为止,我没有看到这种行为的原因。 我注意到另一件事。如果您给单元格一个彩色的 selectedBackgroundView,您在重新加载期间按住的单元格似乎永远不会回到未选择状态 - 但是,如果您记录选定状态,它会将其显示为未选择。我什至尝试在prepareForReuse的覆盖中将其显式设置为NO,但这没有任何区别。下面继续。 有趣的是,如果在您制作了这些不可选择的单元格之一之后,如果您选择了其他“正常”单元格之一,它将适当地显示所选的背景视图,并且当您触摸非-seelctable 单元格,“正常”单元格返回未选中状态。因此,似乎集合视图被通知触摸不可选择的单元格,但没有调用其 didSelectItem 方法。好奇。 我还尝试在 prepareForReuse 中提交选定和突出显示的状态,但没有成功。不知道为什么我们没有得到 didSelectItem =[ 【参考方案1】:看起来像一个错误(我相信有一个类似的问题是 cell.selected = YES
没有 -selectItemAtIndexPath:animated:scrollPosition:
导致单元格无法被取消选择)
但是,如果你这样做:
[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
它按预期工作,而不是 [self.collectionView reloadData]
。
更新:找到the answer of the issue mentioned above
另一个更新:看来这确实是一个错误。在ios8模拟器上测试了原项目,现在问题已经解决了。
【讨论】:
【参考方案2】:根据 @Alladinian 的 回答说,在您的演示中使用 self.collectionView reloadItemsAtIndexPaths:.....
而不是使用 [self.collectionView reloadData]
,我也尝试过
[self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
它也可以正常工作。
【讨论】:
以上是关于如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格的主要内容,如果未能解决你的问题,请参考以下文章
更改单元格中的数据后,UITableView 中的自定义单元格将无法正确重新加载
在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图