我有一个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
?
谢谢!
答案 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:
方法。