UICollectionView - 删除所有项目或更新以刷新它

时间:2014-03-07 03:55:20

标签: ios uicollectionview

我正在开发基于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?感谢。

更新:这个错误是因为我使用了自定义布局,它有一些错误的逻辑,现在已经修复了。

1 个答案:

答案 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];

还有其他方法可能会更有效但这应该让你开始。一旦正确完成基本设置,您可以根据需要使用其他方法进行插入和批处理。