Loading.. Current Page is Loading.

Mac开发 - Table View(2)

7. February 2010

我们在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开发 , , , , ,

Add comment


(Will show your Gravatar icon)  

(Match case,A is not a!)
  Country flag

biuqbr
  • Comment
  • Preview
Loading



About me

Hello,欢迎来到我的博客,我叫郭靖(但不是大侠),我是一个程序员,现居北京,同时我还爱好设计和前端开发。
jguoer.comshangducms.com都在使用,还可以通过前缀dxwt访问电信和网通线路。:)

Suggest Articles

Loading..
感谢风云互联提供免费稳定优质的企业级主机 京ICP备09081424号 Best view on Mac OS X