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

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

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

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

Ответы

Ответ 1

... Обращаясь к документации UICollectionView

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

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

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

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

}

Ответ 2

Если вы вставляете несколько 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]];          
    }
}

Ответ 3

– insertItemsAtIndexPaths: выполняется ли работа

Ответ 4

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

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

Вы должны сначала обновить свои данные.