我需要知道何时重新加载UICollectionView已经完成以便以后配置单元格(因为我不是单元格的数据源 - 其他明智的就是已经完成它了...)
我尝试过像
这样的代码[self.collectionView reloadData];
[self configure cells]; // BOOM! cells are nil
我也尝试过使用
[self.collectionView performBatchUpdates:^{
[self.collectionView reloadData];
} completion:^(BOOL finished) {
// notify that completed and do the configuration now
}];
但是当我重新加载数据时,我正在崩溃。
如何将数据重新加载到集合中,并且只有在完成重新加载后才能重新加载 - 执行特定的完成处理程序
答案 0 :(得分:89)
这是由在layoutSubviews期间添加的单元格而不是reloadData引起的。由于layoutSubviews是在reloadData之后的下一个运行循环传递期间执行的,因此您的单元格为空。 试着这样做:
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
[self configure cells];
我有类似的问题并以这种方式解决了。
答案 1 :(得分:5)
在reloadData
的帮助下,不支持动态重新加载集合视图。所有动画都必须使用方法执行,例如
[collectionView deleteItemsAtIndexPaths:indexesToDelete];
[collectionView insertSections:sectionsToInsert];
[collectionView reloadItemsAtIndexPaths:fooPaths];
在performBatchUpdates:
区块内。 reloadData
方法只能用于粗略刷新,删除所有项目并在没有动画的情况下重新布局。
答案 2 :(得分:4)
如果你想在collectionView完成它的reloadData()方法之后执行一些代码,那么试试这个(Swift):
self.collectionView.reloadData()
self.collectionView.layoutIfNeeded()
dispatch_async(dispatch_get_main_queue()) { () -> Void in
// Put the code you want to execute when reloadData is complete in here
}
这样做的原因是因为调度块中的代码被放到了行的后面(也称为队列)。这意味着它正在排队等待所有主线程操作完成,包括reloadData()的方法,然后才开启主线程。