有时我从viewForSupplementaryElementOfKind得到这个“索引0超出空数组的边界”错误。它有时只发生,通常集合正常加载,一切运行顺利。我想知道什么阵列是空的?注册的细胞? (我尝试通过代码或界面构建器注册它们,但仍然没有变化)
我猜测有时这个方法在加载集合时被过早调用,而且缺少一些尚未加载的数据。
有人能指出我的方向吗?
我的实施很简单: (我在视图上使用了正确的重用标识符)
- (UICollectionReusableView *)collectionView:(UICollectionView *)theCollectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)theIndexPath{
UICollectionReusableView *theView;
if(kind == UICollectionElementKindSectionHeader)
{
theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath];
} else {
theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer" forIndexPath:theIndexPath];
}
return theView;}
答案 0 :(得分:1)
经过长时间的磨难,我发现:
崩溃,如果你从Nib加载你的集合视图,它在流布局中设置了Nib文件非零截面标题大小。
它没有崩溃,如果在流布局中将Nib文件设置为零大小的节标题,然后在viewDidLoad中正确设置它:
- (void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerNib:[UINib nibWithNibName:@"HeaderView" bundle:nil]
forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:sHeaderViewIdentifier];
[self.collectionView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellWithReuseIdentifier:sCellIdentifier];
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;
layout.headerReferenceSize = CGSizeMake(self.collectionView.bounds.size.width, 50.f);
[layout invalidateLayout];
}
答案 1 :(得分:-2)
我仍然不知道为什么这有时会崩溃但似乎如果我用try-catch块包装这个代码并分配一个视图而不是出列一个,那么该集合将继续加载就好了..
if(kind == UICollectionElementKindSectionHeader) {
theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath];
}
变成:
if(kind == UICollectionElementKindSectionHeader)
{
@try {
theView = [theCollectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:theIndexPath];
}
@catch (NSException * e) {
NSLog(@"Exception: %@", e);
theView = [[UICollectionReusableView alloc] init];
}
@finally {
return theView;
}
}
我知道分配一个UICollectionReusableView不是一个好主意,但它现在是一个quik修复,或者直到找到真正的问题。