Sto sperimentando con la nuova API NSCollectionView
, introdotta in El Capitan.NSCollectionView dataSource non funziona correttamente
Dopo il video WWDC, creo una sottoclasse di NSCollectionViewFlowLayout
per determinare il layout della vista di raccolta.
class Layout : NSCollectionViewFlowLayout {
override func prepareLayout() {
super.prepareLayout()
self.minimumInteritemSpacing = 0
self.minimumLineSpacing = 0
let cheight = self.collectionView!.bounds.height
let cwidth = self.collectionView!.bounds.width
self.itemSize = CGSizeMake(cwidth/2.0, cheight/6.0)
}
}
Dopo di che, ho creato una sottoclasse NSObject
a servire come fonte di dati.
class DataSource : NSObject, NSCollectionViewDataSource {
func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
return 5
}
func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem {
/* DOESN'T GET CALLED! */
let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: indexPath)
item.view.wantsLayer = true
item.view.layer?.backgroundColor = NSColor.redColor().CGColor
return item
}
}
Il problema è checollectionView:itemForRepresentedObjectAtIndexPath:
non viene mai chiamato.
Questo è come mi inizializzare il panorama collezione:
let collectionView = NSCollectionView(frame: view.bounds)
let dataSource = DataSource()
let layout = Layout()
collectionView.collectionViewLayout = layout
collectionView.registerClass(NSCollectionViewItem.self,
forItemWithIdentifier: "cell")
collectionView.dataSource = dataSource
collectionView.backgroundColors = [.blackColor()]
posso vedere chiaramente la vista nella sua collezione superview, ma non ci sono le cellule.
Inoltre, questa linea, se chiamata all'esterno del delegato (ma dopo che la classe della cella è stata registrata) fa arrestare l'app!
let item = collectionView.makeItemWithIdentifier("cell", forIndexPath: /*any index path*/)
sto facendo qualcosa di sbagliato o è NSCollectionView
nuova API rotto?
Grazie.
Questa è probabilmente una domanda stupida, ma stai aggiungendo la vista raccolta alle sottoview della tua vista, giusto? – Aaron
@ Arar I sono. Riesco a vedere la vista raccolta nella sua superview (senza celle) –
come sai che il metodo non è stato chiamato? hai impostato qualche breakpoint all'interno di quel metodo? o hai provato a registrare qualcosa nel corpo del metodo? è il tuo file 'cell.xib' nello stesso pacchetto? o crei l'interfaccia a livello di programmazione (come hai registrato un _class_ ma non un _nib_)? hai modificato il modulo di flusso della vista raccolta _ "legacy" _ ad es. _ "flusso" _ in IB? – holex