Cocoa 将NSTableView绑定到NSMutableArray
我正在学习Cocoa,但我遇到了一个问题:我想使用绑定将NSMutableArray的内容绑定到NSTableView。我读了很多关于它们的文档,但我无法使它们工作(我的表格中没有显示任何内容) 事实如下: 我创建了一个简单的模型,名为Cocoa 将NSTableView绑定到NSMutableArray,cocoa,nsarray,cocoa-bindings,Cocoa,Nsarray,Cocoa Bindings,我正在学习Cocoa,但我遇到了一个问题:我想使用绑定将NSMutableArray的内容绑定到NSTableView。我读了很多关于它们的文档,但我无法使它们工作(我的表格中没有显示任何内容) 事实如下: 我创建了一个简单的模型,名为MTMTask,它包含两个属性,priority和text: mtask.h @interface MTMTask : NSObject { NSString *priority; NSString *text; } @property(copy) NSSt
MTMTask
,它包含两个属性,priority
和text
:
mtask.h
@interface MTMTask : NSObject {
NSString *priority;
NSString *text;
}
@property(copy) NSString* priority;
@property(copy) NSString* text;
- (id) initWithPriority :(NSString*)newPriority andText:(NSString*)newText;
@end
mtask.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
然后我创建了MTaskController:
mtaskcontroller.h
#import <Cocoa/Cocoa.h>
#import "MTMTask.h"
@interface MTMTaskController : NSObject {
NSMutableArray *_tasksList;
}
- (NSMutableArray *) tasksList;
@end
最后我编辑了MainMenu.xib:我添加了一个NSObject
,并将其类设置为MTMTaskController
。然后我添加了一个名为TasksListController
的NSArrayController,其内容出口绑定到MTMTaskController.tasksList
。我还将其模式设置为Class
和Class namemtmtmtask
。我将NSTableView
的两列的值
出口绑定到TasksListController
文本和优先级
但当我运行这个程序时,它并不是真正的成功:表中什么都没有显示
你对我的问题有什么想法吗?我想我遗漏了什么,但我不知道是什么
提前谢谢 在从nib唤醒中为控制器分配对象时,创建对象,将其添加到数组中,然后将该数组设置为任务列表 关于绑定,您需要了解KVO(Key-value-observing),这是一种机制,通过该机制,绑定对象可以知道它们绑定的内容已经更改 在awakefromnib方法中,您刚刚直接设置了数组,它不调用KVO 我创建了一个示例Xcode项目(Xcode 3.1),您可以使用它。这将为任务列表创建一个属性,在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:
消息中夹心分配,但我将留给您作为练习。您是否设置了断点以确保实际创建了控制器和对象?您可能忘记将控制器作为对象添加到xib文件中,在这种情况下,awakeFromNib
将不会被调用。只是尝试了一下:我在awakeFromNib
中放入了一个NSLog()调用,它将显示在控制台中。看起来问题不在那里。它工作得很好!非常感谢你!我想我已经理解你的解释了。我需要更多地使用@property。谢谢你的解释!我今天遇到了完全相同的问题。你的解释也帮了我的忙。谢谢你帮我省去了一个大麻烦!
- (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];