如何在 UITableViewCell 子类中注册 UICollectionViewCell、HeaderCollectionReusableView?

Posted

技术标签:

【中文标题】如何在 UITableViewCell 子类中注册 UICollectionViewCell、HeaderCollectionReusableView?【英文标题】:How to register UICollectionViewCell, HeaderCollectionReusableView in a UITableViewCell subclass? 【发布时间】:2017-03-19 07:48:10 【问题描述】:

我创建了一个 UITableViewCell 子类。

import UIKit

class CategoryRow : UITableViewCell 
    @IBOutlet weak var collectionView: UICollectionView!

  override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code
  

  override func setSelected(_ selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
  


extension CategoryRow : UICollectionViewDataSource 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return 12
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! VideoCell
        cell.backgroundColor = .red
        return cell
    

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

    switch kind 

    case UICollectionElementKindSectionHeader:
      let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderCollectionReusableView", for: indexPath)
      headerView.backgroundColor = UIColor.blue;
      return headerView

    case UICollectionElementKindSectionFooter:
      let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderCollectionReusableView", for: indexPath) 

      footerView.backgroundColor = UIColor.green;
      return footerView

    default:

      assert(false, "Unexpected element kind")
    
  



extension CategoryRow : UICollectionViewDelegateFlowLayout 

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

现在当我运行这段代码时,我会崩溃

2017-03-19 12:41:43.298 DemoProject[15229:156486] *** Assertion failure in -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.6.21/UICollectionView.m:4971
2017-03-19 12:41:43.306 DemoProject[15229:156486] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindSectionHeader with identifier HeaderCollectionReusableView - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

我很清楚这是因为 Cell 或 View 没有注册。它由xib制作。

在 UIViewController 中,我们确实在 ViewDidLoad 中注册,所以它可以工作。同样,哪种方法最适合注册 nib。

我尝试将代码放入

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code
  

谁能告诉我在 UITableViewCell 中注册 Cell 的正确方法?

【问题讨论】:

【参考方案1】:

试试这个:

awakeFromNib()UITableViewCell 子类中注册集合视图单元格和补充视图。

override func awakeFromNib()

    super.awakeFromNib()
    collectionView.register(UINib(nibName:"Your_Nib_Name"), forCellWithReuseIdentifier: "videoCell")
    collectionView.register(UINib(nibName:"Your_Nib_Name"), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderCollectionReusableView")
    collectionView.register(UINib(nibName:"Your_Nib_Name"), forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "HeaderCollectionReusableView")

【讨论】:

【参考方案2】:

在您的 CategoryRow 课程中,试试这个:

override func awakeFromNib() 
    super.awakeFromNib()
    // Initialization code
    collectionView?.register(UINib(nibName: "<Nib Name>", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HeaderCollectionReusableView")

【讨论】:

以上是关于如何在 UITableViewCell 子类中注册 UICollectionViewCell、HeaderCollectionReusableView?的主要内容,如果未能解决你的问题,请参考以下文章

子类化 UITableViewCell 不适用于出队

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

UITableViewCell 故事板注册依赖于初始视图控制器?

UITableViewcell 和 UITableVIew 上的手势识别器

UIWebView 在我的 UITableViewCell 子类中覆盖触摸事件

如何让 UITableViewCell 在自定义 UIView 子类上调用 setHighlighted 或 setSelected?