这真的很简单,一旦你理解了它(当然!)。您不能将 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 中,将 myMutableArray 替换为 self,然后您可以使用数组作为数据源。
无论如何,对于可变数组,重要的是,任何时候更改它,都需要让 table view 知道它已被更改,因此需要发送 table view -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]];
}
如果将valueForKey: 替换为valueForKeyPath: 并且您的Person 类也有以下方法:
-(Person*) mother;
-(Person*) father;
-(NSString*) fullName; // concatenation of given name and family name
您可以添加具有以下标识符的表列:father.fullName 或 mother.familyName,这些值将被自动填充。