2016-03-26 6 views
2

Ich versuche, eine programmgesteuert mit einem NSCollectionViewDataSource erstellen.Erstellen von NSCollectionView mit Datenquelle programmgesteuert

Der Code ist sehr einfach:

self.collectionView = [[NSCollectionView alloc] init]; 
// Add collection view to self.view etc. 
self.collectionView.dataSource = self; 
[self.collectionView registerClass:[NSCollectionViewItem class] forItemWithIdentifier:@"test"] 
self.collectionView.collectionViewLayout = gridLayout; 
[self.collectionView reloadData] 

Diese den folgenden Verfahren führt immer genannt (wenn ich nicht setzen die collectionViewLayout Eigenschaft explizit diese beiden auch nicht genannt werden):

- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView*)collectionView 
- (NSInteger)collectionView:(NSCollectionView*)collectionView numberOfItemsInSection:(NSInteger)section 

collectionView:itemForRepresentedObjectAtIndexPath: wird jedoch nie aufgerufen. Gibt es noch etwas, das ich tun muss, um sicherzustellen, dass die letzte Datenquellenmethode aufgerufen wird? Ich habe sichergestellt, dass die beiden Zählaufrufe> 0 zurückgeben, also ist das nicht das Problem.

+0

versuchen Sie, von der GridLayout auf die neue zu ändern (ich vergesse, wie es heißt). Grid-Layout ist das alte Layout. – pickwick

+0

'NSCollectionViewGridLayout' ist in 10.11 mit der neuen Datenquellenmethode verfügbar, also sollte es funktionieren. Versucht, es in 'NSCollectionViewFlowLayout' zu ändern, und es hat leider immer noch nicht' itemForRepresentedObjectAtIndexPath' aufgerufen. – kevinlindkvist

Antwort

7

So scheint es, dass das Problem tatsächlich war, dass ich nicht die NSCollectionView in eine NSScrollView wickelte. Dies hat wahrscheinlich damit zu tun, dass das Layout falsch ausgeführt wird (also die Elemente nicht von der Datenquelle angefordert werden), wenn es nicht in einer Bildlaufansicht eingeschlossen ist.

1

Ich habe in den letzten Tagen verschiedene Szenarien durchgespielt, und ich wage zu sagen, dass die Verwendung einer NSScrollView, oder nicht, praktisch keinen Unterschied macht. Mit oder ohne scrollView habe ich die gleichen Fehler und Einschränkungen bekommen.

Was macht einen großen Unterschied ist die Wahl zwischen "Old School" und der New-Fangled CollectionView. Mit dem „alten Schule“ ich die itemPrototype und Inhalt Eigenschaften bedeuten, Einstellung, etwas wie folgt aus:

NSCollectionView *collectionView = [[NSCollectionView alloc] init]; 
    collectionView.itemPrototype = [TBCollectionViewItem new]; 
    collectionView.content = self.collectionItems; 

    NSInteger index = 0; 
    for (NSString *title in _collectionItems) { 
     NSIndexPath *path = [NSIndexPath indexPathForItem:index inSection:0]; 
     TBCollectionViewItem *item = [collectionView makeItemWithIdentifier:@"Test" forIndexPath:path]; 
     item.representedObject = title; 
     index++; 
    } 
    // Plays well with constraints 

Neue Schule, etwas in dieser Richtung:

NSCollectionView *collectionView = [[NSCollectionView alloc] init]; 
collectionView.identifier = TBCollectionViewIdentifier; 

[collectionView registerClass:[TBCollectionViewItem class] forItemWithIdentifier:TBCollectionViewItemIdentifier]; //register before makeItemWithIdentifier:forIndexPath: is called. 
TBCollectionViewGridLayout *gridLayout = [TBCollectionViewGridLayout collectionViewGridLayout:NSMakeSize(250, 100)]; //getting the contentSize from the scrollView does not help 
collectionView.collectionViewLayout = gridLayout; 
collectionView.dataSource = self; 

Nun, haben Sie den Kommentar bemerkt, dass register : muss vor makeItemWithIdentifier: forIndexPath aufgerufen werden. In der Praxis bedeutet dies, dass Sie registerClass aufrufen müssen, bevor Sie .dataSource setzen, während Sie in Ihrem Code zuerst .dataSource setzen. Der Status des Dokuments:

Obwohl Sie jederzeit neue Elemente registrieren können, dürfen Sie die Methode makeItemWithIdentifier: forIndexPath: erst aufrufen, nachdem Sie das entsprechende Element registriert haben.

Ich wünschte, ich könnte sagen, dass durch das Umschalten dieser beiden Linien alle Layout-Probleme gelöst werden. Leider habe ich festgestellt, dass die .collectionViewLayout/.dataSource-Kombination ein Rezept für (Auto) Layout-Katastrophe ist. Ob das durch den Wechsel von NSCollectionViewGridLayout zu flowLayout behoben werden kann, bin ich noch nicht sicher.

+0

Registrieren Sie die Feder nach dem Einstellen der DataSource ist, was es für mich behoben. Vielen Dank! –

Verwandte Themen