集合视图 Header 可重用视图

CollectionView Header ReusableView

我通过故事板在collectionView中启用了header,然后我编码如下,但是Header没有出现。我想知道有人看到任何问题吗?

AskViewController.swift

override func viewDidLoad() {
    super.viewDidLoad()
    askCollectionView.register(AskCollectionViewHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader")
    askCollectionView.delegate = self
    askCollectionView.dataSource = self
}


extension AskViewController : UICollectionViewDelegateFlowLayout, UICollectionViewDataSource
{
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
     let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "askCollectionViewHeader", for: indexPath) as! AskCollectionViewHeader
     header.askHeaderTitle.text = "Hi"
     return header
    }

    func collectionView(_ collectionView: UICollectionView,
                      layout collectionViewLayout: UICollectionViewLayout,
                      referenceSizeForHeaderInSection section: Int) -> CGSize{
    
        return CGSize(width: view.frame.size.width, height: 200)
    }
}

AskCollectionViewHeader.swift

import UIKit

class AskCollectionViewHeader : UICollectionReusableView {
    
    @IBOutlet weak var askHeaderTitle: UILabel!
}

您正在注册 class,但没有任何实例化此视图的 askHeaderTitle

使用 collection 视图 headers,您有三个选择:

  1. 定义故事板场景中的可重用视图(通过将“Collection 可重用视图”拖到您在 Interface Builder 中设置的 collection 视图上)。在那种情况下,您将在 IB 中指定 class 和重用标识符,并且根本不会在 viewDidLoad 中调用 register,而是让情节提要来处理.

  2. 在 NIB 中定义可重用视图。在那种情况下,您将在 IB 中注册 NIB,而不是 class.

  3. 以编程方式定义可重用视图。只有在那种情况下,您才会将 register 与 class 一起使用。但是话又说回来,subclass 不会使用 @IBOutlet(因为您没有在 IB 中定义它),并且您将以编程方式创建子视图。

我认为选项 1 最简单,但显然仅当您使用故事板和单元格原型时才适用。如果您计划从多个视图控制器使用一些可重用视图,则选项 2 很有用。如果您想手动完成所有操作,选项 3 是一种可能采用的技术。