我正在学习Cocoa,我遇到了一个问题:我想将NSMutableArray的内容绑定到带有绑定的NSTableView。我阅读了很多关于它们的文档,但我无法让它们工作(我的表格中没有显示任何内容)。
以下是事实:
我创建了一个名为MTMTask
的简单模型,其中包含2个属性,priority
和text
:
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
。我绑定了value
到NSTableView
文本和优先级的两列TasksListController
个出口。
但是当我运行该程序时,它并没有真正成功:表中没有任何内容。
您对我的问题有所了解吗?我想我错过了什么,但我无法弄清楚是什么。
提前致谢!
答案 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:
消息中,但我会将其留给您作为练习。