Issue #437
Normal
Use Omnia for itemId extension
HeaderCell.swift
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | final class HeaderCell: NSView, NSCollectionViewSectionHeaderView {let label: NSTextField = withObject(NSTextField(labelWithString: "")) {
 $0.textColor = R.color.header
 $0.font = R.font.header
 $0.alignment = .left
 $0.lineBreakMode = .byTruncatingTail
 }
 
 override init(frame frameRect: NSRect) {
 super.init(frame: frameRect)
 
 addSubviews([label])
 
 activate(
 label.anchor.centerY,
 label.anchor.left.constant(8)
 )
 }
 
 required init?(coder: NSCoder) {
 fatalError()
 }
 }
 
 | 
ViewController.swift
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | collectionView.register(HeaderCell.self,
 forSupplementaryViewOfKind: NSCollectionView.elementKindSectionHeader,
 withIdentifier: HeaderCell.itemId
 )
 
 func collectionView(_ collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: NSCollectionView.SupplementaryElementKind, at indexPath: IndexPath) -> NSView {
 
 if kind == NSCollectionView.elementKindSectionHeader {
 let view = collectionView.makeSupplementaryView(
 ofKind: kind,
 withIdentifier: HeaderCell.itemId,
 for: indexPath
 ) as! HeaderCell
 
 let menu = app.menus[indexPath.section]
 view.label.stringValue = menu.name
 
 return view
 } else {
 return NSView()
 }
 }
 
 | 
In generic subclass
If use CollectionViewHandler from Omnia, then need to add @objc due to a bug in Swift compiler for subclassing generic class
| 1
 | @objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
 | 
MyHandler.swift
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | import AppKitimport Omnia
 
 class MyHandler: CollectionViewHandler<App.Key, KeyCell> {
 override init() {
 super.init()
 
 layout.headerReferenceSize = NSSize(width: 300, height: 30)
 
 collectionView.register(
 HeaderCell.self,
 forSupplementaryViewOfKind: NSCollectionView.elementKindSectionHeader,
 withIdentifier: HeaderCell.itemId
 )
 }
 
 @objc (collectionView:viewForSupplementaryElementOfKind:atIndexPath:)
 func collectionView(_ collectionView: NSCollectionView, viewForSupplementaryElementOfKind kind: NSCollectionView.SupplementaryElementKind, at indexPath: IndexPath) -> NSView {
 
 if kind == NSCollectionView.elementKindSectionHeader {
 let view = collectionView.makeSupplementaryView(
 ofKind: kind,
 withIdentifier: HeaderCell.itemId,
 for: indexPath
 ) as! HeaderCell
 
 let menu = app.menus[indexPath.section]
 view.label.stringValue = menu.name
 
 return view
 } else {
 return NSView()
 }
 }
 }
 
 | 
Use Omnia
Use CollectionViewSectionHandler from Omnia
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | class SectionHandler: CollectionViewSectionHandler<App.Key, KeyCell, HeaderCell> {
 }
 
 sectionHandler.configureHeader = { section, view in
 view.label.stringValue = section.name
 }
 
 sectionHandler.configure = { item, cell in
 cell.shortcutLabel.stringValue = item.shortcut
 cell.nameLabel.stringValue = item.name
 }
 
 sectionHandler.itemSize = { [weak self] in
 guard let self = self else {
 return .zero
 }
 
 let width = self.sectionHandler.collectionView.frame.size.width
 - self.sectionHandler.layout.sectionInset.left
 - self.sectionHandler.layout.sectionInset.right
 
 return CGSize(width: width, height: 18)
 }
 
 | 
Read more