33

UICollectionViewアイテムを動的に/アニメーションで挿入しようとしています。そのため、画像を非同期でダウンロードする機能があり、アイテムをバッチで挿入したいと考えています。

データを取得したら、次のことを行いたいと考えています。

[self.collectionView performBatchUpdates:^{
    for (UIImage *image in images) {
        [self.collectionView insertItemsAtIndexPaths:****]
    }
} completion:nil];

の代わりに の***配列を渡す必要がありますNSIndexPaths。これは、挿入する新しい項目の場所を指す必要があります。場所を提供した後、その位置に表示される実際の画像をどのように提供すればよいのでしょうか。

ありがとうございました


アップデート:

resultsSizeself.resultsには、 のデータから新しいデータが追加される前のデータ ソース配列 のサイズが含まれnewImagesます。

[self.collectionView performBatchUpdates:^{

    int resultsSize = [self.results count];
    [self.results addObjectsFromArray:newImages];
    NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];

    for (int i = resultsSize; i < resultsSize + newImages.count; i++)
          [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];

          [self.collectionView insertItemsAtIndexPaths:arrayWithIndexPaths];

} completion:nil];
4

3 に答える 3

34

「 iOS 用コレクション ビュー プログラミング ガイド」の「セクションとアイテムの挿入、削除、および移動」を参照してください。

単一のセクションまたはアイテムを挿入、削除、または移動するには、次の手順に従う必要があります。

  1. データ ソース オブジェクトのデータを更新します。
  2. コレクション ビューの適切なメソッドを呼び出して、セクションまたはアイテムを挿入または削除します。

コレクション ビューに変更を通知する前に、データ ソースを更新することが重要です。コレクション ビュー メソッドは、データ ソースに現在正しいデータが含まれていることを前提としています。そうでない場合、コレクション ビューはデータ ソースから間違ったアイテム セットを受け取るか、そこにないアイテムを要求してアプリをクラッシュさせる可能性があります。

したがって、あなたの場合、最初にコレクション ビュー データ ソースに画像を追加してから、 を呼び出す必要がありますinsertItemsAtIndexPaths。次に、コレクション ビューは、挿入された項目のビューを提供するようにデータ ソース デリゲート関数に要求します。

于 2012-09-29T21:48:52.197 に答える
5

performBatchUpdates:インデックスからアイテムを削除しているときに同様の問題に直面していましたが、これはメソッドの使用中に行う必要があると思います。

1# 最初に deleteItemAtIndexPath を呼び出して、コレクション ビューからアイテムを削除します。

2# 配列から要素を削除します。

3# データをリロードしてコレクション ビューを更新します。

[self.collectionView performBatchUpdates:^{
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];
            [self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
            [self.addNewDocumentArray removeObjectAtIndex:sender.tag];
        } completion:^(BOOL finished) {
            [self.collectionView reloadData];
        }];

これは、すべてのクラッシュとアサーションの失敗を取り除くのに役立ちます。

于 2016-06-10T11:05:43.400 に答える