我正在使用具有自定义布局的UICollectionView.在两天内我不明白如何添加头到UICollectionView.我有非常简单的视图控制器(在具有自定义布局的故事板中创建):
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 } }
问题是我不明白如何正确添加section头,这个header的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'
我明白,这是因为单元格具有与我要添加的section header相同的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.但是在我的测试中,indexPath总是只是“0”.