理解起来其实很简单(当然!),不能直接使用NSArray作为表格数据源。您需要创建一个自定义对象,实现NSTableViewDataSource协议或在某个现有类中实现该协议 - 通常是控制器。如果您使用Xcode创建标准文档应用程序,则文档控制器类 -(它将被称为MyDocument)是一个很好的类可供使用。
您需要至少实现以下两种方法:
– numberOfRowsInTableView:
– tableView:objectValueForTableColumn:row:
如果您有一个可变数组,想在一个列的表视图中使用它的值,那么以下内容应该可以作为起点:
– numberOfRowsInTableView: (NSTableView*) aTableView
{
return [myMutableArray count];
}
– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
return [myMutableArray objectAtIndex: rowIndex];
}
我突然想到你可以将上述两个方法添加为NSArray的类别(Category),将myMutableArray
替换为self
,然后你就可以使用数组作为数据源。
无论如何,对于可变数组,每次更改它时都需要让表格视图知道它已经被更改,因此你需要发送表格视图-reloadData
。
如果你的表格视图有多列,并且想要用数组中对象的属性填充它,有一个技巧可以让你更容易地实现。假设数组中的对象是名为Person的类的实例,并定义了两个方法:
-(NSString*) givenName;
-(NSString*) familyName;
如果你想让你的表视图有一个列来显示每个属性,你可以将每个列的identifier
属性设置为Person中该列所显示的属性的名称,并使用以下代码:
– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
Person* item = [myMutableArray objectAtIndex: rowIndex];
return [item valueForKey: [tableColumn identifier]];
}
如果你使用
valueForKeyPath:
替换
valueForKey:
,并且你的Person类还拥有以下方法:
-(Person*) mother;
-(Person*) father;
-(NSString*) fullName; // concatenation of given name and family name
你可以使用标识符如
father.fullName
或
mother.familyName
来添加表格列,相应的值将自动填充。