UICollectionView中带有自定义UICollectionViewLayout的节的标题

我正在与自定义布局的UICollectionView 。 在两天内,我无法理解如何将标题添加到UICollectionView 。 我有非常简单的视图控制器(在自定义布局故事板中创build):

 class ACollectionViewController: UICollectionViewController { enum Identifiers: String { case CellIdentifier = "Cell" case HeaderIdentifier = "Header" } override func viewDidLoad() { super.viewDidLoad() self.collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: Identifiers.HeaderIdentifier.rawValue) } // MARK: UICollectionViewDataSource override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.CellIdentifier.rawValue, forIndexPath: indexPath) as Cell cell.backgroundColor = UIColor.redColor() return cell } override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { println("ip = \(indexPath.item)") var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView supplementaryView.backgroundColor = UIColor.blueColor() return supplementaryView } 

这是我的自定义布局:

 class ALayout: UICollectionViewLayout { override func prepareLayout() { super.prepareLayout() } override func collectionViewContentSize() -> CGSize { return self.collectionView!.bounds.size } let itemWidth = 40 override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! { var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) let x: Float = Float(10) * Float(indexPath.item) let y: Float = Float(indexPath.item * itemWidth) attributes.frame = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(itemWidth), height: CGFloat(itemWidth)) return attributes } override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? { var attributes = [UICollectionViewLayoutAttributes]() let sectionsCount = self.collectionView!.dataSource!.numberOfSectionsInCollectionView!(self.collectionView!) for section in 0..<sectionsCount { /// add header attributes.append(self.layoutAttributesForSupplementaryViewOfKind(UICollectionElementKindSectionHeader, atIndexPath: NSIndexPath(forItem: 0, inSection: section))) let itemsCount = self.collectionView!.numberOfItemsInSection(section) for item in 0..<itemsCount { let indexPath = NSIndexPath(forItem: item, inSection: section) attributes.append(self.layoutAttributesForItemAtIndexPath(indexPath)) } } return attributes } override func layoutAttributesForSupplementaryViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! { var attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: elementKind, withIndexPath: indexPath) attributes.frame = CGRect(x: 0, y: 0, width: 320, height: 50) return attributes } } 

问题是我不明白如何正确添加节标题,这个标题的indexPath应该是什么。 代码中的注释添加了标题。 应用程序崩溃在错误的开始

 2014-10-21 13:06:22.793 UICollectionViewLayout-Demo[3805:95924] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of kind: UICollectionElementKindCell with identifier Header - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

而我明白,这是因为单元格具有相同的indexPath我试图添加节标题,但什么应该是标题的indexPath? 或者,也许我完全错了?

先谢谢你。

因为您正在使用,您的崩溃正在出现

 var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView 

尝试出列页眉和页脚(在collectionView:viewForSupplementaryElementOfKind )。 将其更改为

 var supplementaryView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier:Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView 

应该摆脱崩溃,所以你可以调查indexPath。 但在我的testing中,indexPath始终只是“0”。

而不是var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView

应该

 let supplementaryView = collectionView.dequeueReusableSupplementaryViewOfKind(kind withReuseIdentifier:Identifiers.HeaderIdentifier.rawValue, forIndexPath:indexPath) 

您正在使用错误的function标头。 根据苹果文档使用下面的页眉和页脚:

 func dequeueReusableSupplementaryViewOfKind(_ elementKind: String, withReuseIdentifier identifier: String, forIndexPath indexPath: NSIndexPath!) -> AnyObject 

代替:

  var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView