从可变数组中填充NSTableview

S1s*_*hus 7 cocoa objective-c nstableview

我已经尝试了两天,不断遇到死胡同.

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

但是,它们似乎都没有使用带有对象的数组作为数据源,它似乎使用tableview作为数据源.

我想实现的Jonas Jongejan的" 返工"我的代码在这里,用可可前端显示结果.

我知道的任何指示或建议应该很简单,但我在这里旷野迷路了.

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

Jer*_*myP 14

一旦你理解它(当然!),它真的很简单.您不能直接将NSArray用作表源.您需要创建一个实现NSTableViewDataSource的自定义对象,或者在某个现有类中实现该协议 - 通常是控制器.如果使用Xcode创建基于标准文档的应用程序,文档控制器类(它将被称为MyDocument)是一个很好的类.

您需要至少实现以下两种方法:

– numberOfRowsInTableView:
– tableView:objectValueForTableColumn:row:
Run Code Online (Sandbox Code Playgroud)

如果您有一个可变数组,其值要在具有一列的表视图中使用,则以下内容应作为开头:

– numberOfRowsInTableView: (NSTableView*) aTableView
{
    return [myMutableArray count];
}

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
    return [myMutableArray objectAtIndex: rowIndex];
}
Run Code Online (Sandbox Code Playgroud)

我刚刚想到你可以将上面两个方法作为一个类别添加到NSArray替换myMutableArray,self然后你可以使用一个数组作为数据源.


无论如何,使用可变数组,重要的是每次更改它时,都需要让表视图知道它已被更改,因此您需要发送表视图-reloadData.


如果您的表视图有多个列,并且您希望使用数组中的对象属性填充它,那么您可以采用一种技巧来使自己更容易.假设数组中的对象是一个名为Person的类的实例,并定义了两个方法:

-(NSString*) givenName;
-(NSString*) familyName;
Run Code Online (Sandbox Code Playgroud)

并且您希望表视图具有每个列的列,您可以将identifier每列的属性设置为该列显示的Person属性的名称,并使用如下所示的内容:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
    Person* item = [myMutableArray objectAtIndex: rowIndex];
    return [item valueForKey: [tableColumn identifier]];
}
Run Code Online (Sandbox Code Playgroud)

如果替换valueForKey:valueForKeyPath:,则Person类也具有以下方法:

-(Person*) mother;
-(Person*) father;
-(NSString*) fullName;  // concatenation of given name and family name
Run Code Online (Sandbox Code Playgroud)

您可以添加带有以下标识符的表列:father.fullName或者mother.familyName,将自动填充值.