使用reloadData方法重新加载UICollectionView会在重新加载数据之前立即返回

时间:2013-08-14 11:48:37

标签: objective-c-blocks uicollectionview uicollectionviewcell completionhandler

我需要知道何时重新加载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
  }];

但是当我重新加载数据时,我正在崩溃。

如何将数据重新加载到集合中,并且只有在完成重新加载后才能重新加载 - 执行特定的完成处理程序

3 个答案:

答案 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()的方法,然后才开启主线程。