我有一个UICollectionView,它会像这样进行更新:
[self.collectionView performBatchUpdates:^{
[self.collectionView deleteItemsAtIndexPaths:pathsRemoved];
[self.collectionView insertItemsAtIndexPaths:pathsAdded];
}
通常情况下,这样做效果很好,但在某些情况下,数据源计数与原始项目数量(pathsRemoved的计数+pathsAdded的计数)不匹配。
因此,我将此代码包装在@try/@catch块中,然后调用[self.collectionView reloadData]。
然而,重新加载数据后,布局会变得混乱;以前存在的单元格(屏幕上方的单元格,但不在屏幕上)不再显示。集合视图的内容大小是正确的,我可以上下滚动,但只能看到重新加载时屏幕上的单元格。
有趣的是,Reveal.app显示其他单元格实际上存在,但被隐藏了。我有一个预感,这是一个误导,这里正在进行一些视图缓存,但这些单元格仍然在Reveal中列出。
我尝试过无效化布局、调用layoutIfNeeded以及我找到的各种子类流布局技巧,但什么都没有解决。
我不得不通过做自己的良性断言来减轻这个问题,并检查计数是否相加。如果它们相加,就执行performBatchUpdates。否则,不要费事,只需重新加载。这个方法有效,因为我们完全绕过了performBatchUpdates:但我必须问:
从performBatchUpdates:中优雅地恢复断言异常的更好方法是什么?还是说UICollectionView仍然有缺陷(在iOS 7上仍然存在)?