Cocoa 将NSTableView绑定到NSMutableArray

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

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

事实如下:

我创建了一个简单的模型,名为
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 name
mtmtmtask
。我将
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];