在边界之外调用cellForItemAtIndexPath

时间:2013-01-29 06:42:44

标签: ios objective-c uicollectionview

我有一个UICollectionView,它使用自定义UICollectionViewCell类。基本思想是集合视图将遍历目录并显示目录中包含的照片(通过API调用的结果)。初始视图控制器显示UICollectionView,单元格上的点击会生成带有新UICollectionView的新视图。目录内容存储在NSMutableDictionary中,目录ID为密钥。

使用相当短的照片列表创建新视图/集合视图时会出现问题 - 通常少于30.当我旋转设备时,集合视图会尝试重新渲染,并且应用程序崩溃时会出现“索引X超出边界[0 .. Y]“,X是一个大于Y的数字(数组的最后一个元素)。

我注意到,只有当新显示的集合视图的项目少于“根”集合视图时,才会发生这种情况。

以下是相关(部分,无论如何)代码的示例:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return [[photos objectForKey:api.directoryID] count];
}

- (NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
    return 1;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    PhotoCell *photoCell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    photoCell.photo = [[photos objectForKey:api.directoryID] objectAtIndex:indexPath.row];
    return photoCell;
}

至少,我想对cellForItemAtIndexPath进行尝试/捕获,但不知道我将把try / catch放在哪里。也许是在自定义UICollectionView

谢谢!

1 个答案:

答案 0 :(得分:3)

问题在于:

- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section {
    return [[photos objectForKey:api.directoryID] count];
}

我假设您为所有UICollectionView个实例使用了一个委托 dataSource 对象。 如果是这样,请以这种方式重写代码:

- (NSInteger)collectionView:(UICollectionView *)view
         numberOfItemsInSection:(NSInteger)section
{
    if ( view == _firstCollectionView )
    {
        return [[photos objectForKey:api.directoryID] count];
    }
    else if ( view == _secondCollectionView )
    {
        return ...;
    }
}

此外,您应该以这种方式重写collectionView:cellForItemAtIndexPath:方法。