在某些事件中,
我想删除uicollectionview中的所有单元格,并添加新单元格(将在网络调用后填充)
我尝试使用deleteItemsAtIndexPaths。 reloadSections,deleteSections / insertSections。
他们每个人都崩溃了我的应用程序。
以下是我的代码。
NSMutableArray* indexPathArray = [[NSMutableArray alloc] init];
for(int i=0; i < [self.jsonAlbumImageArray count]; ++i)
{
NSIndexPath* newPath = [NSIndexPath indexPathForRow:i inSection:0];
[indexPathArray addObject: newPath];
}
[self.jsonAlbumImageArray removeAllObjects];
if(indexPathArray.count > 0 )
{
[self.collectionView performBatchUpdates:^{
[self.collectionView deleteItemsAtIndexPaths:indexPathArray];
}
completion: nil];
}
// NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)];
// NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:0];
// [self.collectionView reloadSections:indexSet];
[self get_IMAGE_LIST_FROM_SERVER];
答案 0 :(得分:6)
如果您需要比[collectionView reloadData]提供的动画更流畅的动画,您可以使用插入和删除方法来完成,这里有一个示例。
-(void)deleteItemsFromDataSourceAtIndexPaths:(NSArray *)itemPaths
{
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSIndexPath *itemPath in itemPaths) {
[indexSet addIndex:itemPath.row];
}
[self.apps removeObjectsAtIndexes:indexSet];
}
-(void)insertItems:(NSArray*)items ToDataSourceAtIndexPaths:(NSArray *)itemPaths
{
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSIndexPath *itemPath in itemPaths) {
[indexSet addIndex:itemPath.row];
}
[self.apps insertObjects:items atIndexes:indexSet];
}
-(void)reloadDataSmooth{
[self.collectionView performBatchUpdates:^{
NSMutableArray *arrayWithIndexPathsDelete = [NSMutableArray array];
NSMutableArray *arrayWithIndexPathsInsert = [NSMutableArray array];
int itemCount = [self.items count];
for (int d = 0; d<itemCount; d++) {
[arrayWithIndexPathsDelete addObject:[NSIndexPath indexPathForRow:d inSection:0]];
}
[self deleteItemsFromDataSourceAtIndexPaths:arrayWithIndexPathsDelete];
[self.collectionView deleteItemsAtIndexPaths:arrayWithIndexPathsDelete];
int newItemCount = [newItems count];
for (int i=0; i<newAppCount; i++) {
[arrayWithIndexPathsInsert addObject:[NSIndexPath indexPathForRow:i inSection:0]];
}
[self insertItems:newItems ToDataSourceAtIndexPaths:arrayWithIndexPathsInsert];
[self.collectionView insertItemsAtIndexPaths:arrayWithIndexPathsInsert];
}
completion:nil];
}
}
答案 1 :(得分:5)
是的,正如Jonathan所说,我认为您要做的是使用新数据更改数据源,只需“刷新”或重新加载UICollectionView。