iOS到Mac OS之NSTableView的简单使用

iOS和Mac OS的tableview使用略有不同:

1、Mac OS的tableView需要一个container来包裹它,才可以滑动,而iOS的不用;

2、Mac OS的tableview里面多了一个概念叫做column(列),而iOS中没有这个概念。

3、iOS中有section的概念,可是Mac OS中没有(NSCollectionView中有)。


如果Mac开发中需求必需使用section的话,可以去研究下NSCollectionView,这里不做说明。

column,其实就是一个列的概念,可以参照“NSTableColumn”去看它的具体属性和方法。

一个tableview至少包含一个column,在tableview初始化的时候可以像这样添加:

NSTableColumn * column = [[NSTableColumn alloc] initWithIdentifier:@"column"];
[column setWidth:200];
[_tableView addTableColumn:column];
column用一个identifier初始化,然后设置宽度,最后加到tableview中。

这样一个tableview就包含了一列,当然一个tableview可以包含几列:

NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"firstColumn"];
[column1 setWidth:200];
[_tableView addTableColumn:column1];//第一列
    
NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"secondColumn"];
[column2 setWidth:300];
[_tableView addTableColumn:column2];//第二列
像这样可以添加多列,每一列是水平排列的,先加的会排在左边,依次向右。


上面还提到了tableview的container,Mac OS中tableview是不自带滚动效果的,所以一般我们用scrollView来做tableView的container,从而让tableview可以实现滚动。

可以如下面的方式初始化:

_tableContainerView = [[NSScrollView alloc] initWithFrame:CGRectMake(0, 0, 400, 309)];
_tableView = [[NSTableView alloc] initWithFrame:CGRectMake(0, 0,
                                                               _tableContainerView.frame.size.width,
                                                               _tableContainerView.frame.size.height)];
[_tableContainerView setDocumentView:_tableView];
[self.window.contentView addSubview:_tableContainerView];
先初始化一个container然后把container的documentview设置成tableview,然后把container添加到视图上。

像这样tableview就可以有scrollview的滚动效果了。


当然提到tableview我们不可避免的要用到它的datasource和delegate;这里面的方法可以通过API去查看;

值得一提的是:

第一点:::

Mac OS的tableview的datasource有两个必需实现的方法:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView;
- (nullable id)tableView:(NSTableView *)tableView objectValueForTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row;

很明显的看到第二个方法的返回值是nullable的,也就是可空的。也就是说我们有必要实现第二个方法,但是我们可以return nil;

我不清楚为什么一个可以返回nil的方法为什么必需实现,估计和一些视图的初始化有关。

亲测,Mac OS10.10及以下的必需实现这个方法,否则看不到视图,10.11的可以不写该方法,运行正常;稳妥起见,建议写上。

第二点:::

Mac os的tableview在datasource做视图的时候,有两种情况:

1、View Based TableView

2、Cell Based TableView

这两种情况可用的delegate方法不太相同,需要注意,否则可能出现delegate方法不被调用的问题。

下面的链接是一个简单的demo,这里奉上:点击下载NSTableViewDemo

你可能感兴趣的:(mac,OS,NSTableView)