2016-05-21 1 views
1

私はiOSのUICollectionViewに慣れていて、ストーリーボードを使用せずにOSXでNSCollectionViewを設定しようとしています(ほとんどのチュートリアルでは.xibsを使用しているので若干異なります)。 APIも同様ですが、コレクションビューでdataSourceのcollectionView:itemForRepresentedObjectAtIndexPath:メソッドを呼び出すことができません。NSCollectionViewのcollectionView:itemForRepresentedObjectAtIndexPath:メソッドが呼び出されない

私がダウンして、私はこのデータソースのメソッドを呼び出すためにコレクションビューを取得するために必要なことだろうと思ったものを最小に私の元のコードを簡素化しました:

@import Cocoa; 

static NSString * const kCollectionViewControllerItemID = @"ItemID"; 

@interface CollectionViewItem : NSCollectionViewItem 
@end 

@implementation CollectionViewItem 
@end 

@interface CollectionViewController : NSViewController <NSCollectionViewDelegate, NSCollectionViewDataSource> 

@property (nonatomic, strong) NSCollectionView *collectionView; 

@end 

@implementation CollectionViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSCollectionViewFlowLayout *layout = [[NSCollectionViewFlowLayout alloc] init]; 
    [layout setItemSize:CGSizeMake(100, 100)]; 

    _collectionView = [[NSCollectionView alloc] init]; 
    [_collectionView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [_collectionView setCollectionViewLayout:layout]; 
    [_collectionView setDataSource:self]; 
    [_collectionView setDelegate:self]; 
    [_collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:kCollectionViewControllerItemID]; 
    [[self view] addSubview:_collectionView]; 
    [[self view] addConstraints:@[ 
            [NSLayoutConstraint constraintWithItem:_collectionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:[self view] attribute:NSLayoutAttributeTop multiplier:1.0f constant:0], 
            [NSLayoutConstraint constraintWithItem:_collectionView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:[self view] attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0], 
            [NSLayoutConstraint constraintWithItem:[self view] attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_collectionView attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0], 
            [NSLayoutConstraint constraintWithItem:[self view] attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:_collectionView attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0], 
            ]]; 
} 

- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 1; 
} 

- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //this method is never called 
    return [collectionView makeItemWithIdentifier:kCollectionViewControllerItemID forIndexPath:indexPath]; 
} 

@end 

この実装が欠落していますか?

EDIT:

NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:NSZeroRect]; 
_collectionView = [[NSCollectionView alloc] initWithFrame:NSZeroRect]; 
scrollView.documentView = _collectionView; 
[self.view addSubview:scrollView]; 

collectionView: 再現することは、これは容易にするために、私はGitHubのhttps://github.com/BradB132/OSXCollectionViewTest

+0

他のデータソースメソッドが呼び出されていますか? – rocky

+0

'itemForRepresentedObjectAtIndexPath'メソッドは呼び出されない唯一のメソッドです。このコードサンプルでリポジトリへのリンクを追加したので、簡単に問題を再現できます。 – BradB

答えて

0

上のサンプルプロジェクトは、そう、それはあなたがNSScrollView内でごNSCollectionViewをラップする必要が判明した設定:itemForRepresentedObjectAtIndexPath:今すぐ呼び出される必要があります。

関連する問題