NSTableView不会自己存储数据,而是从一个数据源取数据,而这个数据源是要实现NSTableViewDataSource Protocol的方法,而NSTableView的行为则需要实现NSTableViewDelegate Protocol,比如鼠标双击表格,选中表格哪一行等事件,而这些都不需要通过继承NSTableView来重新实现,只需要通过这个协议重写。
NSTableViewDataSource Protocol必须要实现的方法:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView; 获得表格数据的行数
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 根据行列加载数据
NSTableViewDelegate Protocol的常用方法:
- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 根据cell来加载数据,较为常用
- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 是否允许编辑当前所在行的数据
- (BOOL)selectionShouldChangeInTableView:(NSTableView *)tableView 能否选中表格的行,返回NO则不能选中表格的每行数据
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row 指定哪几行能选中或不能选中
- (BOOL)tableView:(NSTableView *)tableView shouldSelectTableColumn:(NSTableColumn *)tableColumn 返回YES则选中某列,该列下所有的元素均呈选中状态
- (void)tableView:(NSTableView *)tableView mouseDownInHeaderOfTableColumn:(NSTableColumn *)tableColumn 鼠标左键按下响应事件函数
- (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn 鼠标左键按下响应事件函数
- (void)tableView:(NSTableView *)tableView didDragTableColumn:(NSTableColumn *)tableColumn 移动列位置响应事件函数
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
storyboard 使用
1、从show the object library 将Table View控件往view托,添加一个TableView控件。
2、如果你的cell想要有ImageView和Label,可以删除默认的Table Cell View,然后从Show the Object Library 中将Image &Text Table Cell View控件拖进去。
3、绑定:选中Table View控件,选择Show the Connections inspector。在Outlets中将dataSource 和delegate 项托中圆点到View Controller控制器进行绑定
4、自定义每行的高度,选中TableView控件,选择Show the Size inspector。在Table View中的Row Size Style 项选择:Custom或者勾选Explicit(效果是一样的),编辑Row Height(高度) 大小。
5、设置每列的身份:选中TableColumn,将Identifier 设置成IdentifierName(自己设,跟代码结合)
6、设置每列中TableViewCell的身份,选中Cell View,将Identifier设置成IdentifierName(自己设,跟代码结合)。
例子:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
return self.dataArr1.count;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSString *identifierStr = [tableColumn identifier];
if ([identifierStr isEqualToString:@"TableColumn1"]) {
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"TableViewCell1" owner:self];
//FirstModel *model = self.dataArray[row];
cellView.textField.textColor = [NSColor blueColor];
cellView.imageView.image = [NSImage imageNamed:@"ceshitongji"]; //设置图片
cellView.textField.stringValue = self.dataArr1[row];//model.content; //设置文字
return cellView;
}else if([identifierStr isEqualToString:@"TableColumn2"]){
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"TableViewCell2" owner:self];
//FirstModel *model = self.dataArray[row];
cellView.textField.textColor = [NSColor redColor];
cellView.imageView.image = [NSImage imageNamed:@"zhuangtaitongji"]; //设置图片
cellView.textField.stringValue = self.dataArr2[row];//model.content; //设置文字
return cellView;
}else{
NSTableCellView *cellView = [tableView makeViewWithIdentifier:@"TableViewCell3" owner:self];
//FirstModel *model = self.dataArray[row];
// cellView.imageView.image = [NSImage imageNamed:@""]; //设置图片
cellView.textField.textColor = [NSColor yellowColor];
cellView.textField.stringValue = self.dataArr3[row];//model.content; //设置文字
return cellView;
}
}