MacOS开发-NSCollectionView使用

在iOS开发中,我们经常会用到UITableView和UICollectionView两种控件进行开发,在MacOS中也有相对应的NSTableView和NSCollectionView,今天在这里记录下NSCollectionView的使用。

创建NSCollectionView

xib拖拽

创建项目工程打开Main.storyboard或Main.xib

然后编写以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)viewDidLoad {
[super viewDidLoad];
self.collectionView.dataSource = self;
[self.collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"item"];
}

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

- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {
CollectionViewItem *item = [collectionView makeItemWithIdentifier:@"item" forIndexPath:indexPath];
item.textLabel.stringValue = [NSString stringWithFormat:@"第%zi个", indexPath.item];
return item;
}

运行程序查看

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 替换viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
NSCollectionView *collectionView = [[NSCollectionView alloc] initWithFrame:self.view.bounds];
NSCollectionViewFlowLayout *layout = [[NSCollectionViewFlowLayout alloc] init];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.itemSize = CGSizeMake(60, 60);
collectionView.collectionViewLayout = layout;
collectionView.dataSource = self;
[collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"item"];

NSClipView *clip = [[NSClipView alloc] initWithFrame:self.view.bounds];
clip.documentView = collectionView;

NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.bounds];
scrollView.contentView = clip;

[self.view addSubview:scrollView];
}

NSCollectionView与UICollectionView的区别

相同点:

  • 都是使用collectionViewLayout对cell的布局
  • 基本属性大都相同,偶尔会有些属性名不一致的问题

不同点:

  • NSCollectionView继承NSView,使用时需要与NSScrollView和NSClipVIew进行组合使用
  • NSCollectionView缺少一些组合方法,如果未找到与UICollectionView相同的方法,可以尝试单独给参数赋值来实现。
  • NSCollectionViewItem继承NSViewController

NSCollectionView使用时的一些坑

  • 创建自定义item时需要勾选xib选项,然后在注册item进复用池时,如果按UICollectionView使用时应该使用nib的方式注册item,运行时程序崩了,你会发现从复用池中获取的item是nil。
  • 在代理方法中未能找到相关选中的方法,只有一个- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths很像的方法,实现之后,发现点击item并不调用此方法。我想到的实现方式是在item中监听鼠标点击事件。
文章作者: 落秋
文章链接: https://www.liyb.vip/2019/09/15/MacOS开发-NSCollectionView使用/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 落秋
打赏
  • 微信
  • 支付宝

评论