web-dev-qa-db-ja.com

reloadDataメソッドを使用してUICollectionViewをリロードすると、データをリロードする直前に戻ります

セルを後で構成するために、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
  }];

しかし、データをリロードするとクラッシュします。

データをコレクションにリロードするにはどうすればいいですか?コレクションがリロードを完了したときのみ-特定の完了ハンドラーを実行してください

23
Avner Barr

これは、reloadDataではなくlayoutSubviewsの間にセルが追加されるために発生します。 reloadSubviewsはreloadDataの後の次の実行ループパスで実行されるため、セルは空です。これを試してください:

[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
[self configure cells]; 

私は同様の問題があり、この方法で解決しました。

94
lukewar

コレクションビューは、reloadDataを使用してアニメーションで再ロードすることはサポートされていません。すべてのアニメーションは、次のようなメソッドで実行する必要があります。

[collectionView deleteItemsAtIndexPaths:indexesToDelete];
[collectionView insertSections:sectionsToInsert];
[collectionView reloadItemsAtIndexPaths:fooPaths];

の中に performBatchUpdates:ブロック。このreloadDataメソッドは、すべてのアイテムが削除され、アニメーションなしで再びレイアウトされるときのラフリフレッシュにのみ使用できます。

5
kelin

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()のメソッドを含むすべてのメインスレッド操作が完了するのを順番に待っていることを意味します。

4
Alan Scarpa