Какао: обновить NSObjectController после разархивирования данных с диска

У меня есть объект, привязанный к пользовательскому интерфейсу с помощью NSObjectController. Я могу заархивировать объект и разархивировать его позже. Пока это работает нормально. В отладчике я вижу, что объект содержит данные, которые я сохранил в предыдущем сеансе. Остается проблема: пользовательский интерфейс не обновляется. Думаю, я должен каким-то образом сообщить NSObjectController, что он должен иметь дело с другим объектом. Но я не знаю как. Я попробовал newObject, но это вообще не сработало.

На данный момент мой код выглядит так:

if ([aOpenPanel runModal] == NSOKButton)
{
    NSString *filename = [aOpenPanel filename];
    rpgCharacter = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];

    // [myCharacterController DoSomething] ???
}

rpgCharacter должен быть объектом для myCharacterController.


person TalkingCode    schedule 02.11.2009    source источник


Ответы (1)


Что вы делаете, так это устанавливаете iVar rpgCharacter напрямую. Чтобы запустить KVO, вам нужно сделать это по-другому:

если вы используете Objective-C 2.0 и синтаксис свойств:

if ([aOpenPanel runModal] == NSOKButton)
{
    NSString *filename = [aOpenPanel filename];
    self.rpgCharacter = [NSKeyedUnarchiver unarchiveObjectWithFile:filename];

}

или, если вы используете KVC напрямую и имеете правильно названный сеттер:

if ([aOpenPanel runModal] == NSOKButton)
{
    NSString *filename = [aOpenPanel filename];
    [self setRpgCharacter:[NSKeyedUnarchiver unarchiveObjectWithFile:filename]];

}
person Abizern    schedule 02.11.2009
comment
Работает отлично. Спасибо. Итак, мне нужно установить объект через свойство или метод доступа для запуска KVO? Да, теперь для меня это имеет смысл. - person TalkingCode; 02.11.2009
comment
да. За исключением методов инициализатора, где они должны быть установлены напрямую developer.apple.com/mac/library/documentation/cocoa/Conceptual/ - person Abizern; 02.11.2009