Привязка NSTableView к NSMutableArray - PullRequest
       11

Привязка NSTableView к NSMutableArray

2 голосов
/ 22 февраля 2010

Я изучаю Какао, и у меня есть проблема: я хотел бы связать содержимое 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. Затем я добавил NSArrayController, называемый TasksListController, с выходом содержимого, связанным с MTMTaskController.tasksList. Я также установил его режим на Class и имя класса MTMTask. Я связал value выход двух столбцов текста NSTableView с TasksListController текстом и приоритетом.

Но когда я запускаю программу, ну, на самом деле, это не успех: ничего не отображается в таблице.

У вас есть идея относительно моей проблемы? Я думаю, что что-то упустил, но я не могу понять, что.

Заранее спасибо!

1 Ответ

2 голосов
/ 22 февраля 2010

Когда вы распределяете объекты для контроллера в состоянии пробуждения от nib, вы создаете объекты, добавляете их в массив и затем устанавливаете этот массив в качестве списка задач.

Особенность привязок заключается в том, что вам необходимо знать о KVO (наблюдении ключевой ценности), который является механизмом, посредством которого связанные объекты знают, что вещи, которые они связали, изменились.

В методе пробуждения от nib вы просто устанавливаете массив напрямую, который не вызывает 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:, но я оставлю это в качестве упражнения для вас.

...