我们在Mac开发 - Table View(1)里面使用了Table View这个控件,可是这个控件是一个非常复杂的控件,我们使用于Array Controller绑定的方式去绑定数据有一个明显的缺点,就是只能绑定一个列的数据,这在很多情况下是没有多大的用处的,这个时候我们就需要绑定多个列的数据,当绑定多个列的数据的时候,我们可以使用Dictionary Controller绑定。
我们首先创建一个项目,然后将UI制作如下图即可。

我们在项目中添加一个文件(类),继承自NSObject,注意,这里不需要使用什么NSView的子/派生类,我们只需要使用NSObject类即可。取名NSDicController,然后我们写头文件如下。
#import <Cocoa/Cocoa.h>
@interface NSDicController : NSObject {
IBOutlet NSWindow *window;
IBOutlet NSTableView *tableView;
IBOutlet NSDictionaryController *dictionaryProxy;
}
@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTableView *tableView;
@end
写完头文件之后,写内容代码。
#import "NSDicController.h"
@implementation NSDicController
@synthesize window;
@synthesize tableView;
@end
写到这里都不是那么难理解,好,我们现在先连接一下我们的元素,因为前几篇文章我已经说的很清楚了,所以这里我就不再详细的讲解如何连接了,我这里给出一些示例即可。首先我们还是加一个object,如下所示。

加完之后,我们更改为我们的相应的类即可,更改之后,我们再连接相应的内容到UI上,依旧还是Control+鼠标连接,连接后连接器如下所示。

这样,我们就连接了我们的基本要素,连接完成后,我们就需要编写代码来实现多列的功能实现了,这里我们需要使用的一个方法是awakeFromNib,连接后,当应用程序启动会自动调用和执行awakeFromNib这个方法,我们更改方法如下,代码可能不那么好理解,我加了一些注释。
#import "NSDicController.h"
@implementation NSDicController
@synthesize window;
@synthesize tableView;
- (void)awakeFromNib
{
//清空现有的table的列
NSArray *tableColumns = [NSArray arrayWithArray:[tableView tableColumns]];
for (NSTableColumn *tableColumn in tableColumns)
[tableView removeTableColumn:tableColumn];
//新增加一个列
NSTableColumn *keyTableColumn = [[[NSTableColumn alloc] initWithIdentifier:@"key"]
autorelease];
[tableView addTableColumn:keyTableColumn];
//新增加一个列
NSTableColumn *valueTableColumn = [[[NSTableColumn alloc] initWithIdentifier:@"value"]
autorelease];
[tableView addTableColumn:valueTableColumn];
//初始化字典
dictionaryProxy = [[NSDictionaryController alloc] initWithContent:nil];
//设置绑定
[keyTableColumn bind:NSValueBinding toObject:dictionaryProxy withKeyPath:@"arrangedObjects.key"
options:nil];
[valueTableColumn bind:NSValueBinding toObject:dictionaryProxy withKeyPath:@"arrangedObjects.value"
options:nil];
//更改字典后自然更改绑定的数据
[dictionaryProxy setContent:[NSDictionary dictionaryWithObjectsAndKeys:@"obj 1", @"key to obj 1",
@"obj 2", @"key to obj 2", nil]];
}
@end
通过上面的代码,我们就能够自动的在程序启动的时候添加相应的列,最后效果如下所示。

虽然我们这里使用的是启动时就绑定并添加了数据,但是我们很多时候需要执行按钮按下的方法之后才添加数据,不过不要紧,当我们设置了控件于一些数据的绑定之后,我们只需要更改相应的数据源即可。例如现在这里我们讲table的两个列绑定了一个dictionary,以后我们需要更改列的值的时候,只需要更改这个数据字典即可,系统会自动帮我们更新View。例如可以连接button并写相应的代码去进行操作。
- (IBAction)buttonClicked:(id)sender
{
//更改字典后自然更改绑定的数据
[dictionaryProxy setContent:[NSDictionary dictionaryWithObjectsAndKeys:@"obj 1", @"key to obj 1",
@"obj 2", @"key to obj 2", nil]];
}
只要在相应的作用域之内,我们只需要更改相应的dictionary的数据即可,无须关心其他部分。
PS:在这里我们就看到一个MVC的一个非常好的地方,就是视图只管视图,数据只管数据,控制器只管控制器的一个优点。
Mac开发
dictionary, controller, nsdictionarycontroller, nstextview, mutiple, column