UICollectionView 部分标题崩溃 iOS 8

Posted

技术标签:

【中文标题】UICollectionView 部分标题崩溃 iOS 8【英文标题】:UICollectionView section header crashing iOS 8 【发布时间】:2014-10-16 14:39:31 【问题描述】:

我有一个 UIView 子类,它有一个动态创建的 UICollectionView。在 ios7 中一切正常,显示标题也很好。

iOS 8 根本不调用此方法,应用程序崩溃。

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

如果我注释掉这个方法并将页眉/页脚大小设置为 0,iOS 8 就不会再崩溃了。

这里是创建集合视图的代码:

int spacing = 39;

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(199, 60);
if (IS_IOS8) layout.estimatedItemSize = CGSizeMake(199, 60);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
layout.minimumInteritemSpacing = 1;
layout.minimumLineSpacing = 1;
layout.sectionInset = UIEdgeInsetsMake(1,1,1,1);
layout.headerReferenceSize = CGSizeMake(self.width - spacing*2, 50.0f);
layout.footerReferenceSize = CGSizeZero;

self.collectionView=[[UICollectionView alloc] initWithFrame:CGRectMake(spacing, 5, self.width - spacing*2, self.height - spacing*2) collectionViewLayout:layout];

self.collectionView.dataSource = self;
self.collectionView.delegate = self;

[self.collectionView registerClass:[OCEListCell class] forCellWithReuseIdentifier:CellIdentifier];
[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:HeaderCellIdentifier];
[self.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:FooterCellIdentifier];
self.collectionView.backgroundColor = [UIColor clearColor];


[self addSubview:self.collectionView];

数据源方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

    UICollectionReusableView * view = nil;

    NSLog(@"viewForSupplementaryElementOfKind");
    if ([kind isEqualToString:UICollectionElementKindSectionHeader] )
    
        view = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:HeaderCellIdentifier forIndexPath:indexPath];
        view.backgroundColor = [UIColor clearColor];

        UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 15, view.width, 40)];
        lbl.textColor = [UIColor defaultTextColor];
        lbl.font = [UIFont bookFontOfSize:25.0f];
        lbl.numberOfLines = 1;
        lbl.text = indexPath.section == 0 ? @"Section 1 Header" : @"Section 2 Header";
        [view addSubview:lbl];
    
    else if ([kind isEqualToString:UICollectionElementKindSectionFooter])
    
        view = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:FooterCellIdentifier forIndexPath:indexPath];
        view.backgroundColor = [UIColor clearColor];
    

    NSLog(@"viewForSupplementaryElementOfKind:%@", view);
    return view;




-(CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section

    CGSize size = CGSizeMake(collectionView.width, 50);
    NSLog(@"referenceSizeForHeaderInSection: %@", NSStringFromCGSize(size));
    return size;



-(CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section

    CGSize size = CGSizeZero;
    NSLog(@"referenceSizeForFooterInSection: %@", NSStringFromCGSize(size));
    return size;

【问题讨论】:

什么是崩溃信息? 不幸的是,我实际上什至没有得到堆栈跟踪。我已经尝试过符号断点和默认异常处理程序。我正在使用一个库进行分析,它们显示了一个崩溃日志,即:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil”我是没有在其中的任何地方调用 insertObject,所以我不太确定这是否是准确的崩溃日志 我确定这是一个错误。 ***.com/questions/25460323/… 是否有其他方法可以将页眉或页脚破解到具有自调整单元格的 uicollectionview 中? 【参考方案1】:

我刚刚再次查看此内容,因为不久前我能够让页眉和页脚在不同的视图中工作,并发现此特定视图的问题在于设置了 estimateSize 参数。

注释掉这一行就摆脱了我的烦恼:

if (IS_IOS8) layout.estimatedItemSize = CGSizeMake(177, 60);

这是一个令人沮丧的诊断,因为没有错误、编译器警告等提供任何信息。

【讨论】:

请打开错误报告。

以上是关于UICollectionView 部分标题崩溃 iOS 8的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView:如果为空部分,则自定义 FlowLayout 崩溃

tvOS 11 更新 UICollectionView 崩溃

UICollectionView 和解析图像(Swift)没有错误但崩溃

UICollectionView 仅显示最后一部分的页脚

应用程序在“layoutAttributesForSupplementaryElement”上崩溃

如何在一个视图中添加多个部分 UICollectionView 单元格