无法使 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 标头中的标签添加约束?