3

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

2 回答 2

1

经过长时间玩这个崩溃后,我发现:

  • 如果您从 Nib 加载集合视图并在其流布局中在 Nib 文件中设置了非零的 Section Header 大小,则它会崩溃。

  • 它不会崩溃,如果您在流布局中在 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];
    }
    
于 2014-05-02T20:21:25.893 回答
-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 不是一个好主意,但它现在是一个快速修复,或者直到我找到真正的问题。

于 2013-11-07T09:28:02.143 回答