我有一个UICollectionView
,它运行正常,但我想以编程方式将一些UICollectionViewCells
项添加到集合视图中。
那我怎么能实现这个目标呢?
进一步阐明:当我以编程方式说我的意思是在运行时插入一个单元格,当一个动作被触发时,而不是在加载应用程序时(使用viewDidLoad
方法)。我知道何时更新模型并在UICollectionView
方法中调用insertItemsAtIndexPaths:
。它应该创建一个新的单元格,但它没有这样做,它会抛出一个错误。
答案 0 :(得分:24)
...参考UICollectionView documentation
你可以完成:
插入,删除和移动章节和项目要插入,删除, 或移动单个部分或项目,请按照下列步骤操作:
- 更新数据源对象中的数据。
- 调用集合视图的相应方法以插入或删除节或项目。
醇>在通知之前更新数据源至关重要 集合视图的任何变化。集合视图方法假设 您的数据源包含当前正确的数据。如果是的话 不是,集合视图可能会收到错误的项目集 您的数据源或询问不存在的项目并使您崩溃 应用程序。当您以编程方式添加,删除或移动单个项目时, 集合视图的方法自动创建动画以反映 变化。但是,如果要同时为多个更改设置动画, 您必须在块内执行所有插入,删除或移动调用 将该块传递给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])
您必须先更新数据。