2010-08-03 50 views
7

我一直在尝试这两天,并不断跑入死胡同。从可变数组中填充NSTableview

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

但是他们都没有使用一个数组作为数据源,它似乎使用tableview作为数据源。

我试图执行Jonas Jongejan的“重做”我的代码here,用Cocoa前端来显示结果。

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

我可以通过设置阵列

回答

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更换myMutableArrayself,然后你可以使用数组作为数据源。


反正有可变数组,重要的是你改变它任何时候,你需要让表视图知道它已经改变了,所以你需要发送的表视图-reloadData


如果你的表视图有多个列,你想用你的数组中的对象的属性来填充它,有一个窍门,你可以做,使之更容易为自己。比方说,你的数组中的对象是定义了一个名为人用两种方法的类的实例:

-(NSString*) givenName; 
-(NSString*) familyName; 

,你希望你的表视图,以对每个那些一列,可以设置每列的identifier财产对财产的人的名称该列显示和使用类似以下内容:

– 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.fullNamemother.familyName,这些值将自动填充。

1

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

也许设置数据源自我,并利用这些委托方法基础上的行和列#

+0

@ willcodejavaforfood的答案是针对iPhone,但你可以按照该链接看看我的意思 – RSully 2010-08-03 15:21:09

+0

哎呀,我的iPhone上有iPhone :) – willcodejavaforfood 2010-08-03 15:22:34

3

你可以通过数据源路径自己完成所有繁重的工作,或者你可以让绑定为你完成所有繁重的工作。将NSArrayController添加到包含表格视图的nib文件中。确保nib的文件所有者被设置为具有可变数组的相同类。将阵列控制器的contentArray绑定到File's Owner.myMutableArray。对于每个列将Value绑定到阵列控制器arrangedObjects并添加相应的键路径。这将允许你得到像用户免费分类的东西,如果你需要的话。