CollectionView 方法“referenceSizeForHeaderInSection”抛出异常

Posted

技术标签:

【中文标题】CollectionView 方法“referenceSizeForHeaderInSection”抛出异常【英文标题】:CollectionView method 'referenceSizeForHeaderInSection' throws exception 【发布时间】:2017-09-14 04:49:15 【问题描述】:

我正在尝试为我的 collectionView 创建具有动态高度的标题。但是当我实现“referenceSizeForHeaderInSection”时,应用程序崩溃并出现以下异常:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindSectionHeader with identifier FeedHeader - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

下面是collectionView标头的代码:

func numberOfSections(in collectionView: UICollectionView) -> Int 
    return feedArray.count

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 
    return CGSize(width: collectionView.frame.size.width - 20 , height: 70)


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets 
    return UIEdgeInsetsMake(10, 10, 10, 10);


func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FeedHeader", for: indexPath) as! FeedHeader

    return header

FeedHeader 类是空的,因为我还没有在标题中添加任何标签:

class FeedHeader: UICollectionReusableView



当我删除 referenceSizeForHeaderInSection 实现时,应用程序可以正常运行。

已将标题链接到故事板中的类。 可能是什么问题?

提前致谢。

【问题讨论】:

【参考方案1】:

遇到问题了。这是因为 collectionView 将可重用视图作为页脚而不是页眉。将其更改为标题,现在应用程序运行良好。感谢大家的帮助。

【讨论】:

我有同样的问题“将其更改为标题”你是怎么做到的?【参考方案2】:

检查您是否为SupplementaryViewOfKind 注册了

如果没有,请尝试在 viewDidLoad

中注册您的补充视图
collectionView.register(nibName, forSupplementaryViewOfKind: "String", withReuseIdentifier: "Identifier")

【讨论】:

当我删除 referenceSizeForHeaderInSection 实现时,该应用程序运行良好。我不认为这是注册标头的问题。 欲了解更多信息,请阅读***.com/a/29656061/8432814 答案【参考方案3】:

确保您的重用标识符与FeedHeader 相同

检查以下内容:

    在 Storyboard 中选择您的标题视图

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView 

    let headerView: TitleHeaderCollectionReusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TitleHeaderCollectionReusableView", for: indexPath as IndexPath) as! TitleHeaderCollectionReusableView
 return headerView

也实现你喜欢的高度

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize 

            return CGSize(width: collectionObj.frame.size.width, height: 50)
    

【讨论】:

我已经实施了所有提到的建议。它仍然给出了同样的错误。但是,如果我删除 referenceSizeForHeaderInSection,该应用程序工作正常。

以上是关于CollectionView 方法“referenceSizeForHeaderInSection”抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView 方法“referenceSizeForHeaderInSection”抛出异常

旋转时多次调用方法 collectionview(cellForItemAtIndexPath)

如何从另一个类执行 collectionView 方法?

iOS 为啥不能从 UITapGestureRecognizer 调用方法 collectionView:didSelectItemAtIndexPath:?

如何在选择行方法collectionview中播放视频

如何防止collectionView:didSelectItemAtIndexPath委托方法被调用多次