4

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

当使用相当短的照片列表创建新视图/集合视图时会出现问题 - 通常少于 30。当我旋转设备时,集合视图尝试重新渲染,并且应用程序崩溃并显示“索引 X 超出bounds [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. 也许在一个习惯UICollectionView

谢谢!

4

1 回答 1

3

问题在这里:

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

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

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

你也应该collectionView:cellForItemAtIndexPath:以这种方式重写方法。

于 2013-04-29T08:42:54.263 回答