2013-03-22 6 views
17

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

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

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

+0

Когда вы говорите «это ошибка», очень полезно сообщить, что это за ошибка в вашем вопросе. Обычно полезно также видеть фактический код, а не только некоторый текст, смутно описывающий его. – Flexo

+0

Хорошо прочитайте код в ближайшее время. спасибо Flexo –

ответ

23

... Ссылаясь на UICollectionView documentation

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

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

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

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

} 
6

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

+10

больше примеров было бы более полезно ~~ – zhkzyth

11

При вставке множественным 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]];   
    } 
} 
+0

Что такое indexPath в этом коде? –

+1

Для вставки элемента в представление коллекции вам нужно указать indexPath. Здесь iam выполняет вставку после вырезания/копирования с использованием операций меню, поэтому я знаю, куда вставлять элемент. Вы можете создать один indexPath с помощью '[NSIndexPath indexPathForItem: 0 inSection: 0]', а затем вставить элемент в этот indexPath, или это может быть выбранный элемент indexPath для вставки в позицию выбранного элемента. –

+0

Пробовал, выдает ошибку. –

3

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

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

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

+0

Для коллекцииView вы действительно должны использовать 'let indexPath = IndexPath (item: index, section: 0)' –

Смежные вопросы