我已经习惯了iOS的UICollectionView,并且尝试在OSX上设置一个NSCollectionView,而不使用任何故事板(大多数教程使用.xibs,所以它们略有不同)。API看起来类似,但我无法获得集合视图来调用dataSource的collectionView:itemForRepresentedObjectAtIndexPath:方法。
我已经将我的原始代码简化到了我认为调用此dataSource方法所需的集合视图的最小值:
@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这个实现缺少了什么?
编辑:为了便于复制,我在GitHub https://github.com/BradB132/OSXCollectionViewTest上建立了一个示例项目。
发布于 2016-08-26 23:57:32
因此,您需要将NSCollectionView封装在NSScrollView中:
NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:NSZeroRect];
_collectionView = [[NSCollectionView alloc] initWithFrame:NSZeroRect];
scrollView.documentView = _collectionView;
[self.view addSubview:scrollView];现在应该调用collectionView:itemForRepresentedObjectAtIndexPath:。
https://stackoverflow.com/questions/37358949
复制相似问题