viewForSupplementaryElementOfKind正在崩溃“索引0超出空数组的边界”

时间:2013-06-27 11:50:21

标签: uicollectionview

有时我从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;}

2 个答案:

答案 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修复,或者直到找到真正的问题。