Как программно вставить ячейку в UICollectionVIew?

у меня есть UICollectionView и она отлично работает, но я хочу добавить несколько UICollectionViewCells элементы программно в представлении коллекции.

Итак, как я могу этого достичь?

чтобы уточнить: когда я говорю программно, я имею в виду вставку ячейки во время выполнения, когда действие запускается, а не когда приложение загружается (используя viewDidLoad метод). Я знаю, когда модель обновляется и вызов UICollectionView на insertItemsAtIndexPaths: метод. Он должен создавать новые ячейки, но это не так делая это, он выдает ошибку.

4 ответов


...ссылаясь на документация UICollectionView

вы можете выполнить:

вставка, удаление и перемещение разделов и элементов для вставки, удаления, или переместите один раздел или элемент, выполните следующие действия:

  1. обновить данные в объекте источника данных.
  2. вызвать соответствующий метод представления коллекции, чтобы вставить или удалить раздел или пункт.

Это критическое обновление источника данных перед уведомлением просмотр коллекции любых изменений. Методы представления коллекции предполагают что ваш источник данных содержит правильные данные. Если это так нет, представление коллекции может получить неправильный набор элементов из источник данных или запросить элементы, которых нет, и аварийно завершить работу приложение. При программном добавлении, удалении или перемещении одного элемента методы представления коллекции автоматически создают анимации для отражения этот изменения. Однако, если вы хотите анимировать несколько изменений вместе,, необходимо выполнить все вызовы insert, delete или move внутри блока и передайте этот блок методу 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];

}

если вы вставляете несколько items на UICollectionView, вы можете использовать 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]];          
    }
}

– insertItemsAtIndexPaths: работает


вот как вставить элемент в Swift 3:

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

сначала необходимо обновить данные.