web-dev-qa-db-ja.com

セルをUICollectionVIewにプログラムで挿入する方法は?

UICollectionViewがあり、正常に機能しますが、プログラムでコレクションビューにいくつかのUICollectionViewCellsアイテムを追加したいです。

どうすればこれを達成できますか?

さらに明確にするために、プログラムで言うと、実行時にセルを挿入することを意味します。アプリがロードされたとき(viewDidLoadメソッドを使用)ではなく、アクションが発生したときです。モデルが更新され、insertItemsAtIndexPaths:メソッドでUICollectionViewが呼び出されたことがわかります。新しいセルを作成する必要がありますが、それは実行されず、エラーがスローされます。

21
Muhammad Nasir

... ICollectionViewドキュメント を参照することにより

達成できること:

セクションとアイテムの挿入、削除、および移動単一のセクションまたはアイテムを挿入、削除、または移動するには、次の手順を実行します。

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

変更をコレクションビューに通知する前に、データソースを更新することが重要です。コレクションビューメソッドは、データソースに現在正しいデータが含まれていることを前提としています。そうでない場合、コレクションビューはデータソースから間違ったアイテムセットを受け取るか、存在しないアイテムを要求してアプリをクラッシュさせる可能性があります。単一のアイテムをプログラムで追加、削除、または移動すると、コレクションビューのメソッドは変更を反映するアニメーションを自動的に作成します。ただし、複数の変更を一緒にアニメーション化する場合は、ブロック内ですべての挿入、削除、または移動の呼び出しを実行し、そのブロックをperformBatchUpdates:completion:メソッドに渡す必要があります。その後、バッチ更新プロセスはすべての変更を同時にアニメーション化し、同じブロック内でアイテムを挿入、削除、または移動する呼び出しを自由に混在させることができます。

あなたの質問から:例えば、ジェスチャー認識を登録し、以下を実行して新しいセルを挿入することができます:

// in .h 
@property (nonatomic, strong) NSMutableArray *data;

// in .m 
@synthesize data
// 

- (void)ViewDidLoad{
      //.... 

    myCollectonView.dataSource = self;
    myCollectionView.delegate = self; 
    data = [[NSMutableArray alloc] initWithObjects:@"0",@"1", @"2" @"3", @"4", 
                                                   @"5",@"6", @"7",  @"8", @"9",  
                                                   @"10", @"11", @"12", @"13",
                                                   @"14", @"15", nil];

    UISwipeGestureRecognizer *swipeDown = 
     [[UISwipeGestureRecognizer alloc] 
       initWithTarget:self action:@selector(addNewCell:)];
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
        [self.view addGestureRecognizer:swipeDown];
    //.. 
} 


-(void)addNewCell:(UISwipeGestureRecognizer *)downGesture {
    NSArray *newData = [[NSArray alloc] initWithObjects:@"otherData", nil];
    [self.myCollectionView performBatchUpdates:^{
        int resultsSize = [self.data count]; //data is the previous array of data
        [self.data addObjectsFromArray:newData];
        NSMutableArray *arrayWithIndexPaths = [NSMutableArray array];

        for (int i = resultsSize; i < resultsSize + newData.count; i++) {
            [arrayWithIndexPaths addObject:[NSIndexPath indexPathForRow:i 
                                                              inSection:0]];
        }
        [self.myCollectionView insertItemsAtIndexPaths:arrayWithIndexPaths];
    } completion:nil];

}
24
abdimuna

複数のitemsUICollectionViewに挿入する場合は、performBatchUpdates:

[self.collectionView performBatchUpdates:^{
    // Insert the cut/copy items into data source as well as collection view
    for (id item in self.selectedItems) {
        // update your data source array
        [self.images insertObject:item atIndex:indexPath.row];

        [self.collectionView insertItemsAtIndexPaths:
          [NSArray arrayWithObject:indexPath]];          
    }
}
12
Anil Varghese

– insertItemsAtIndexPaths:仕事をする

6
Oleg

Swift 3にアイテムを挿入する方法は次のとおりです。

    let indexPath = IndexPath(row:index, section: 0) //at some index
    self.collectionView.insertItems(at: [indexPath])

最初にデータを更新する必要があります。

4
Curnelious