如何以编程方式在UICollectionVIew中插入Cell?

时间:2013-03-22 14:12:47

标签: ios objective-c collectionview

我有一个UICollectionView,它运行正常,但我想以编程方式将一些UICollectionViewCells项添加到集合视图中。

那我怎么能实现这个目标呢?

进一步阐明:当我以编程方式说我的意思是在运行时插入一个单元格,当一个动作被触发时,而不是在加载应用程序时(使用viewDidLoad方法)。我知道何时更新模型并在UICollectionView方法中调用insertItemsAtIndexPaths:。它应该创建一个新的单元格,但它没有这样做,它会抛出一个错误。

4 个答案:

答案 0 :(得分:24)

...参考UICollectionView documentation

  

你可以完成:

     

插入,删除和移动章节和项目要插入,删除,   或移动单个部分或项目,请按照下列步骤操作:

     
      
  1. 更新数据源对象中的数据。
  2.   
  3. 调用集合视图的相应方法以插入或删除节或项目。
  4.         

    在通知之前更新数据源至关重要   集合视图的任何变化。集合视图方法假设   您的数据源包含当前正确的数据。如果是的话   不是,集合视图可能会收到错误的项目集   您的数据源或询问不存在的项目并使您崩溃   应用程序。当您以编程方式添加,删除或移动单个项目时,   集合视图的方法自动创建动画以反映   变化。但是,如果要同时为多个更改设置动画,   您必须在块内执行所有插入,删除或移动调用   将该块传递给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];

}

答案 1 :(得分: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]];          
    }
}

答案 2 :(得分:6)

– insertItemsAtIndexPaths:完成工作

答案 3 :(得分:4)

以下是如何在Swift 3中插入项目:

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

您必须先更新数据。