从可变数组中填充NSTableView

7
我已经尝试了两天,但一直遇到瓶颈。
我学习了Aaron Hillegass的Cocoa编程MAC OS X,并完成了所有与NSTableview和可变数组相关的练习,我一直在尝试修改它们以适应我的需求。
然而,它们似乎都没有使用对象数组作为数据源,而是使用表格视图作为数据源。
我正在尝试实现Jonas Jongejan的代码“重构” here,并使用Cocoa前端来显示结果。
任何提示或建议都可以,我知道这应该很简单,但我在这里迷失了方向。
我可以通过设置数组来填充表格。
4个回答

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的类别(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.fullNamemother.familyName来添加表格列,相应的值将自动填充。

3

您可以选择使用数据源方式自行完成所有的繁重工作,或者让绑定为您完成所有繁重工作。在nib文件中添加一个NSArrayController,其中包含表格视图。确保nib的File's Owner设置为具有可变数组的相同类。将数组控制器的contentArray绑定到File's Owner.myMutableArray。对于每一列,将Value绑定到数组控制器arrangedObjects并添加适当的键路径。这将允许您免费获得用户排序等功能(如果您需要)。


1

苹果公司为表视图编程提供了完整的指南,因此我建议您从该指南的使用表数据源部分开始。


1
在 iPhone 上(我知道你说的是 Mac,但也许这可以帮助),你必须使用委托来加载 tableView。它会请求一个单元格,然后你可以使用数组在需要的位置填充数据。 我不确定这是否适用于 Mac,但值得研究一下。
也许将 dataSource 设置为 self,并使用那些委托方法根据行和列号访问你的数组。

@willcodejavaforfood的回答是针对iPhone的,但是你可以通过那个链接来了解我的意思。 - smdvlpr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接