2016-03-26 23 views
2

プログラムでNSCollectionViewDataSourceを使用してNSCollectionViewを作成しようとしています。プログラムでデータソースを使用したNSCollectionViewの作成

コードは非常に簡単です:

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] 

これは、(私が明示的にcollectionViewLayoutプロパティを設定しない場合は、これら二つはどちらか呼び出されません)と呼ばれる取得次のメソッドにつながる:

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

ただし、collectionView:itemForRepresentedObjectAtIndexPath:は呼び出されません。最後のデータソースメソッドが呼び出されていることを確認するために何か必要なことはありますか?私は2つのカウント呼び出しが> 0を返すようにしました、それは問題ではありません。

+0

gridLayoutから新しいレイアウトに変更してみてください(私はその名前を忘れています)。グリッドレイアウトは古いスタイルのレイアウトです。 – pickwick

+0

'NSCollectionViewGridLayout'は新しいデータソースメソッドで10.11で利用できるので、動作するはずです。 'NSCollectionViewFlowLayout'に変更しようとしましたが、残念ながら' itemForRepresentedObjectAtIndexPath'は呼び出されませんでした。 – kevinlindkvist

答えて

7

実際には問題は、NSScrollViewにNSCollectionViewをラップしていないようだったようです。スクロール・ビューでラップされていない場合は、レイアウトが正しく行われていないため(アイテムがデータ・ソースから要求されないように)、これはおそらく関係しています。

1

私は過去のさまざまなシナリオで作業していましたが、NSScrollViewを使用するかどうかは実際には違いがないと言っています。 scrollViewの有無にかかわらず、私は同じエラーと制限で終わった。

「古い学校」と新しく抱かれたコレクションビューの間には大きな違いがあります。

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 

新しい学校、これらの線に沿って何か:今

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; 

、あなたがコメントregisterClassに気づいたかもしれない「古い学校は、」私はitemPrototypeと内容のプロパティ、このようなものを設定することを意味することにより、 :makeItemWithIdentifier:forIndexPathの前に呼び出さなければなりません。実際には、これは.dataSourceを設定する前にregisterClass:を呼び出すことを意味しますが、コードでは.dataSourceを最初に設定します。ドキュメントの状態:

いつでも新しいアイテムを登録できますが、対応するアイテムを登録するまでmakeItemWithIdentifier:forIndexPath:メソッドを呼び出さないでください。

この2つの行を切り替えると、すべてのレイアウトの問題が解決されると思います。残念ながら、.collectionViewLayout/.dataSourceの組み合わせが(自動)レイアウトの惨事のレシピであることがわかりました。それがNSCollectionViewGridLayoutからflowLayoutに切り替えることで修正できるかどうかは、まだわかりません。

+0

dataSourceを設定した後にnibを登録すると、それが私のために修正されました。ありがとう! –

関連する問題