23

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

那么我该如何实现呢?

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

4

4 回答 4

26

...通过参考UICollectionView 文档

您可以完成:

插入、删除和移动部分和项目 要插入、删除或移动单个部分或项目,请执行以下步骤:

  1. 更新数据源对象中的数据。
  2. 调用集合视图的适当方法来插入或删除部分或项目。

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

}
于 2013-10-22T15:28:15.437 回答
12

如果要插入多个itemsinto 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];
于 2013-03-22T14:23:18.450 回答
5

– insertItemsAtIndexPaths:做这项工作

于 2013-03-22T14:23:12.120 回答
4

以下是在 Swift 3 中插入​​项目的方法:

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

您必须首先更新您的数据。

于 2017-04-14T13:12:36.177 回答