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