无法使 UICollectionView 标头工作

Posted

技术标签:

【中文标题】无法使 UICollectionView 标头工作【英文标题】:Cannot get UICollectionView header to work 【发布时间】:2014-03-29 21:20:22 【问题描述】:

相关代码如下:

控制器:

- (instancetype)init 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];

    layout.itemSize = CGSizeMake(106.0, 106.0);
    layout.minimumInteritemSpacing = 1.0;
    layout.minimumLineSpacing = 1.0;
    layout.headerReferenceSize = CGSizeMake(320.0, 44.0);

    return (self = [super initWithCollectionViewLayout:layout]);


- (void)viewDidLoad 
    [super viewDidLoad];

    // some setup

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

    [self.collectionView registerClass:[ITPhotosHeaderView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];



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

    if (kind == UICollectionElementKindSectionHeader) 
        ITPhotosHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                          withReuseIdentifier:@"header" forIndexPath:indexPath];
        headerView = [[ITPhotosHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 44.0)];
        reusableView = headerView;
    

    return reusableView;

这是我得到的错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'the view returned from -collectionView:viewForSupplementaryElementOfKind:atIndexPath (UICollectionElementKindSectionHeader,<NSIndexPath: 0xc000000000000016> length = 2, path = 0 - 0) was not retrieved by calling -dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: or is nil (<ITPhotosHeaderView: 0x1781b9de0; baseClass = UICollectionReusableView; frame = (0 0; 320 44); layer = <CALayer: 0x17802f980>>)

我调试并确保它没有返回 nil。因此我觉得它的registerClass 部分不能正常工作。我会很感激任何意见。谢谢。

【问题讨论】:

【参考方案1】:

这里有一个明确的问题:

    ITPhotosHeaderView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
                                                      withReuseIdentifier:@"header" forIndexPath:indexPath];
    headerView = [[ITPhotosHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 44.0)];

该代码是荒谬的。在第一行中,您将标题视图出列。在第二行中,你肆无忌惮地扔掉刚刚出列的标题视图并重新制作一个全新的。

【讨论】:

但是我从来没有见过那个特殊的异常,所以学习起来很有趣!因此,您的问题是一个好问题;毕竟,其他人可能会偶然发现同样的异常。

以上是关于无法使 UICollectionView 标头工作的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 标头上的 UITapGestureRecognizer 不起作用?

如何向 UICollectionView 标头中的标签添加约束?

当提供商因缺少授权标头而拒绝飞行前请求时,使客户端CORS正常工作

保留对 UICollectionView 标头的引用

UICollectionView 标头未显示

Swift UICollectionView 标头未正确显示