从可变数组中填充NSTableview

时间:2010-08-03 15:15:13

标签: objective-c cocoa nstableview

我已经尝试了两天,并且经常陷入死胡同。

我经历过Aaron Hillegass的MAC OS X可可编程,并完成了所有与NSTableview和可变数组相关的练习,我一直在尝试修改它们以满足我的需求。

然而,它们似乎都没有使用带有对象作为数据源的数组,它似乎使用tableview作为数据源。

我正在尝试使用Cocoa前端实现我的代码here的Jonas Jongejan的“ reworking”来显示结果。

我知道的任何指示或建议应该很简单,但我在这里的荒野中迷失了。

我可以通过设置数组来填充表格

4 个答案:

答案 0 :(得分:14)

真的很简单,一旦你理解它(当然!)。您不能直接将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然后你可以使用一个数组作为数据源。


无论如何,使用可变数组,重要的是每次更改它时,都需要让表视图知道它已被更改,因此您需要发送表视图-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.fullNamemother.familyName,这些值将自动填充。

答案 1 :(得分:3)

你可以去数据源路线并自己完成所有繁重的工作,或者你可以让绑定为你完成所有繁重的任务。将NSArrayController添加到包含表视图的nib文件中。确保将nib的文件所有者设置为包含可变数组的同一个类。将数组控制器的contentArray绑定到File's Owner.myMutableArray。对于每个列绑定Value到数组控制器arrangedObjects并添加适当的密钥路径。如果您需要,这将允许您免费获得用户排序等内容。

答案 2 :(得分:1)

Apple提供了Table View Programming的完整指南,因此我建议您从该指南的Using a Table Data Source部分开始。

答案 3 :(得分:1)

在iPhone上(我知道你在谈论Mac,但也许这可能会有所帮助)你必须使用委托来加载tableView。它要求一个单元格,并使用您的数组填写所需的数据。 我不确定这是否适用于Mac,但它值得研究。

也许将dataSource设置为self并使用这些委托方法根据行和列访问您的数组#