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

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

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

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


person Muhammad Nasir    schedule 22.03.2013    source источник
comment
Когда вы говорите, что выдает ошибку, очень полезно указать, что это за ошибка в вашем вопросе. Обычно полезно также видеть реальный код, а не просто какой-то текст, который его расплывчато описывает.   -  person Flexo    schedule 24.03.2013
comment
Хорошо, я опубликую код в ближайшее время. спасибо Флексо   -  person Muhammad Nasir    schedule 24.03.2013


Ответы (4)


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

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

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

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

Крайне важно обновить источник данных, прежде чем уведомлять представление коллекции о любых изменениях. Методы представления коллекции предполагают, что ваш источник данных содержит правильные на данный момент данные. Если это не так, представление коллекции может получить неправильный набор элементов из вашего источника данных или запросить элементы, которых нет, и привести к сбою вашего приложения. Когда вы добавляете, удаляете или перемещаете один элемент программно, методы представления коллекции автоматически создают анимацию, отражающую изменения. Однако если вы хотите одновременно анимировать несколько изменений, вы должны выполнять все вызовы вставки, удаления или перемещения внутри блока и передавать этот блок в метод PerformBatchUpdates:completion:. Затем процесс пакетного обновления анимирует все ваши изменения одновременно, и вы можете свободно смешивать вызовы для вставки, удаления или перемещения элементов в одном блоке.

Из вашего вопроса: вы можете, например, зарегистрировать распознаватель жестов и вставить НОВУЮ ячейку, выполнив следующие действия:

in

// 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];

}
person abdimuna    schedule 22.10.2013

Если вы вставляете несколько 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]];          
    }
} completion:nil];
person Anil Varghese    schedule 22.03.2013
comment
Для вставки элемента в представление коллекции вам необходимо указать indexPath. Здесь я выполняю вставку после вырезания/копирования с помощью операций меню, поэтому я знаю, куда вставить элемент. Вы можете создать один indexPath, используя [NSIndexPath indexPathForItem:0 inSection:0], а затем вставить элемент в этот indexPath, или это может быть выбранный элемент indexPath для вставки в позицию выбранного элемента. - person Anil Varghese; 22.03.2013
comment
[self.collectionView PerformBatchUpdates:^{} завершение:^(BOOL завершено) {}]; Ошибка может быть из-за того, что вы не включили блок завершения - person Vincent Joy; 03.02.2016

– insertItemsAtIndexPaths: делает работу

person Oleg    schedule 22.03.2013
comment
больше примеров было бы полезнее~~ - person zhkzyth; 02.01.2016

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

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

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

person Curnelious    schedule 14.04.2017
comment
Для collectionView вы действительно должны использовать let indexPath = IndexPath(item:index, section: 0) - person Ashley Mills; 03.02.2018