将NSTableView绑定到NSMutableArray

时间:2010-02-22 09:10:35

标签: cocoa nsarray cocoa-bindings

我正在学习Cocoa,我遇到了一个问题:我想将NSMutableArray的内容绑定到带有绑定的NSTableView。我阅读了很多关于它们的文档,但我无法让它们工作(我的表格中没有显示任何内容)。

以下是事实:

我创建了一个名为MTMTask的简单模型,其中包含2个属性,prioritytext

MTMTask.h

@interface MTMTask : NSObject {
 NSString *priority;
 NSString *text;
}

@property(copy) NSString* priority;
@property(copy) NSString* text;

- (id) initWithPriority :(NSString*)newPriority andText:(NSString*)newText;

@end

MTMTask.m

#import "MTMTask.h"

@implementation MTMTask

@synthesize text, priority;

- (id) initWithPriority:(NSString *)newPriority andText:(NSString *)newText {
 if (self = [super init]) {
  priority = newPriority;
  text = newText;
  return self;
 }
 return nil;
}

@end

然后我创建了MTMTaskController:

MTMTaskController.h

#import <Cocoa/Cocoa.h>
#import "MTMTask.h"

@interface MTMTaskController : NSObject {
 NSMutableArray *_tasksList;
}

- (NSMutableArray *) tasksList; 

@end

MTMTaskController.m

#import "MTMTaskController.h"

@implementation MTMTaskController

- (void) awakeFromNib
{ 
 MTMTask *task1 = [[MTMTask alloc] initWithPriority:@"high" andText:@"Feed the hungry cat"];
 MTMTask *task2 = [[MTMTask alloc] initWithPriority:@"low" andText:@"Visit my family"];

 _tasksList = [[NSMutableArray alloc] initWithObjects:task1, task2, nil];
}

- (NSMutableArray*) tasksList
{
 return _tasksList;
}

@end

最后我编辑了MainMenu.xib:我添加了NSObject并将其类设置为MTMTaskController。然后我添加了一个名为TasksListController的NSArrayController,其内容出口绑定到MTMTaskController.tasksList。我还将其模式设置为Class和类名MTMTask。我绑定了valueNSTableView文本和优先级的两列TasksListController个出口。

但是当我运行该程序时,它并没有真正成功:表中没有任何内容。

您对我的问题有所了解吗?我想我错过了什么,但我无法弄清楚是什么。

提前致谢!

1 个答案:

答案 0 :(得分:2)

当您从nib中唤醒时为控制器分配对象时,您可以创建对象,将它们添加到数组中,然后将该数组设置为任务列表。

关于绑定的事情是你需要知道KVO(键值观察),这是绑定对象知道它们已经绑定的东西已经改变的机制。

在nib方法的清醒中你刚刚设置了不调用KVO的数组。

我已经创建了一个示例Xcode项目(Xcode 3.1),你可以download from here。这为任务列表创建了一个属性,在awakeFromNib方法中我使用属性语法分配数组,该语法为您处理KVO:

- (void)awakeFromNib {
    Task *task1 = [[Task alloc] initWithPriority:@"high" andText:@"Feed the cat"];
    Task *task2 = [[Task alloc] initWithPriority:@"low" andText:@"Visit my familiy"];

    self.taskArray = [[NSMutableArray alloc] initWithObjects:task1, task2, nil];

}

或者,您可以将作业夹在willChangeValueForKey:didChangeValueForKey:消息中,但我会将其留给您作为练习。