UICollectionView reloadItemsAtIndexPaths

时间:2014-01-13 03:25:31

标签: xcode pagination uicollectionview nsindexpath

我一直试图绕过UICollectionView的reloadItemsAtIndexPaths方法。

我有一个名为objectsArray的对象数组。当用户滚动到我的集合视图的底部时,我从后端获取下一批对象,并通过调用[objectsArray addObjectsFromArray:objects]将其附加到objectsArray;这样做之后,我调用[self.collectionView reloadData],我知道这很贵。

我想使用下面的代码进行优化,但是在调用reloadItemsAtIndexPaths时我遇到了断言失败。

    if (self.searchPage == 0) {
        parseObjectsArray = [[NSMutableArray alloc] initWithArray:relevantDeals];
        [self.collectionView reloadData];

    } else {

        NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
        for (int i = 0; i < [relevantDeals count]; i++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
            [indexPaths addObject:indexPath];
        }

        [parseObjectsArray addObjectsFromArray:relevantDeals];
        [self.collectionView reloadItemsAtIndexPaths:indexPaths];
        //[self.collectionView reloadData];
    }

错误: * 断言失败 - [UICollectionView _endItemAnimations],/ SourceCache / UIKit / UIKit-2903.2 / UICollectionView.m:3716

非常感谢任何帮助/提示。

谢谢!

3 个答案:

答案 0 :(得分:5)

看起来添加的项目是新的,换句话说,您正在添加以前不存在的项目。在这种情况下,只需用insertItemsAtIndexPaths替换reloadItemsAtIndexPaths:indexPaths:

[self.collectionView insertItemsAtIndexPaths:indexPaths]; // Use this for newly added rows
//[self.collectionView reloadItemsAtIndexPaths:indexPaths]; // Use this for existing rows which have changed

答案 1 :(得分:3)

断言错误具有误导性。直到我实施

之后
            @try
            {
                [self.collectionView insertItemsAtIndexPaths:indexPaths];
            }
            @catch (NSException *except)
            {
                NSLog(@"DEBUG: failure to insertItemsAtIndexPaths.  %@", except.description);
            }

我是否意识到我的indexPaths计算错误了。新对象的索引偏移量被一个关闭,使我的collectionview认为我添加的对象比我在numberOfItemsInSection中指定的更多。

感谢所有试图提供帮助的人!

答案 2 :(得分:0)

当您增加/减少数组中的项目数但与数据源方法不匹配时,通常会出现此错误

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

您是否正确更新?