セルを後で構成するために、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
}];
しかし、データをリロードするとクラッシュします。
データをコレクションにリロードするにはどうすればいいですか?コレクションがリロードを完了したときのみ-特定の完了ハンドラーを実行してください
これは、reloadDataではなくlayoutSubviewsの間にセルが追加されるために発生します。 reloadSubviewsはreloadDataの後の次の実行ループパスで実行されるため、セルは空です。これを試してください:
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
[self configure cells];
私は同様の問題があり、この方法で解決しました。
コレクションビューは、reloadData
を使用してアニメーションで再ロードすることはサポートされていません。すべてのアニメーションは、次のようなメソッドで実行する必要があります。
[collectionView deleteItemsAtIndexPaths:indexesToDelete];
[collectionView insertSections:sectionsToInsert];
[collectionView reloadItemsAtIndexPaths:fooPaths];
の中に performBatchUpdates:
ブロック。このreloadData
メソッドは、すべてのアイテムが削除され、アニメーションなしで再びレイアウトされるときのラフリフレッシュにのみ使用できます。
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()のメソッドを含むすべてのメインスレッド操作が完了するのを順番に待っていることを意味します。