2014-03-22 1 views
0

Вкратце: я связываю NSTextField с владельцем файла (контроллер вида) и путь ключа модели representedObject.firstName, но редактирование текстового поля не изменяет firstName.Почему NSViewController не является обязательным?

Подробнее. У меня есть простая программа, которая ничего не делает, кроме создания экземпляра Thing (простой класс с некоторыми свойствами) и ThingViewController. Контроллер имеет связанный с ним .xib с простым пользовательским интерфейсом - пару текстовых полей для привязки к свойствам Thing.

@interface Thing : NSObject 
@property (nonatomic, strong) NSString *firstName; 
@property (nonatomic, strong) NSString *lastName; 
@property (nonatomic) BOOL someBool; 
@end 

И в приложение делегата ...

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *cv = self.window.contentView; 
    ThingViewController *vc = [[ThingViewController alloc] 
           initWithNibName:@"ThingViewController" bundle:nil]; 
    theThing = [Thing new]; 
    theThing.firstName = @"Rob"; 
    vc.representedObject = theThing; 
    [cv addSubview:vc.view]; 
} 

ThingViewController.xib прост:

enter image description here

А вот привязка для этого первого текстового поля:

enter image description here

Когда я запускаю, текстовое поле показывает «Rob», поэтому оно работает в этом направлении, но затем, когда я редактирую текстовое поле, свойство firstNametheThing не изменяется.

Что я делаю неправильно?

Редактировать: Вот ссылка на архивный файл проект для указанной выше коды: https://drive.google.com/file/d/0B2NHW8y0ZrBwWjNzbGszaDQzQ1U/edit?usp=sharing

+0

Попробуйте «постоянно обновлять значение?». Был необходим для меня в основном контексте данных с полем токенов. Редактирование пользователем не было немедленно перенесено на модель. – stevesliva

+0

Я пробовал, но не вижу изменений в поведении. –

ответ

2

Ничто не сильно вашего вид контроллера (ThingViewController), кроме локальных переменной в -applicationDidFinishLaunching :. Как только это выходит из сферы действия, контроллер просмотра освобождается и отменяется. Само представление все еще существует, поскольку оно является подвидным содержимым вашего окна.

После того, как ваш контроллер просмотра освобожден/ушел, текстовое поле не подключается к объекту Thing, поэтому он называет [nil setValue: @ "Новое имя" forKeyPath: @ "представленObject.firstName"].

Добавьте ссылку на контроллер вида (например, переменную экземпляра вашего делегата приложения) и повторите попытку.

@implementation AppDelegate { 
    Thing *theThing; 
    ThingViewController *vc; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *cv = self.window.contentView; 
    vc = [[ThingViewController alloc] initWithNibName:@"ThingViewController" bundle:nil]; 
    theThing = [Thing new]; 
    theThing.firstName = @"Rob"; 
    vc.representedObject = theThing; 

    [cv addSubview:vc.view]; 
} 
+0

Это сделало. Я все еще не переучился из JVM и мира сбора мусора. –