我正在开发基于UICollectionView的应用程序,我将其加载 -
NSUInteger newNumCells = [self.imageArray count];
NSIndexPath* newIndexPath;
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
[indexPaths removeAllObjects];
for (int i = 0; i < newNumCells; ++i) {
newIndexPath = [NSIndexPath indexPathForItem:i inSection:0];
[indexPaths addObject:newIndexPath];
}
self.indexPaths = indexPaths;
[self.collectionView insertItemsAtIndexPaths:indexPaths];
[self.collectionView reloadData];
它运作良好。
然后我在同一页面上有另一个搜索功能,所以当我从服务器获得新的搜索结果时,self.imageArray内容发生了变化,我想刷新当前的UICollectionView,
,删除所有项目,然后插入新的来自当前self.imageArray的项目,但是当我删除项目时,总是崩溃 -
[self.collectionView performBatchUpdates:^{
//self.indexPaths = [self.collectionView indexPathsForVisibleItems];
//[self.imageArray removeAllObjects];
self.indexPaths = [self.collectionView indexPathsForVisibleItems];
[self.imageArray removeAllObjects];
[self.collectionView deleteItemsAtIndexPaths:self.indexPaths];
[self.collectionView.collectionViewLayout invalidateLayout];
//[self.collectionView reloadData];
//[self.collectionView deleteItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
} completion:nil];
崩溃信息 -
Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2903.2/UICollectionViewData.m:341
2014-03-07 11:47:48.450 pixcell8[9089:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0xb4a8430> {length = 2, path = 0 - 0}'
所以我想问一下如何使用新数据刷新UICollectionView
?感谢。
更新:这个错误是因为我使用了自定义布局,它有一些错误的逻辑,现在已经修复了。
答案 0 :(得分:2)
加载集合视图与表视图非常相似。使用delegate和dataSource协议来处理大部分内容。
对于你的情况类似
self.collectionView.dataSource = self;
然后在dataSource方法
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return self.imageArray.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
//Set up and return your cell
}
如果要更改内容,可以替换或更新imageArray和reloadData的内容。
来自API的新内容
[self.imageArray removeAllObjects];
[self.imageArray addObjectsFromArray:apiResponseArray];
[self.collectionView reloadData];
还有其他方法可能会更有效但这应该让你开始。一旦正确完成基本设置,您可以根据需要使用其他方法进行插入和批处理。