Как сохранить привязки Какао после замены экземпляра целевого объекта другим экземпляром того же типа? - PullRequest
1 голос
/ 22 сентября 2009

Я хотел бы иметь возможность использовать привязки для синхронизации моего графического интерфейса пользователя с динамически загружаемым объектом, но как только я заменяю рассматриваемый объект другим объектом того же типа, привязки разрушаются, и графический интерфейс перестает обновляться. Вот код, который поможет вам понять, что я имею в виду:

В моем интерфейсе у меня есть переменная экземпляра для хранения рассматриваемого объекта:

@interface AppDelegate : NSObject {
    CustomObject *anObject; // This object has a "NSString *textValue" property
}

Затем в моей реализации я создаю экземпляр объекта:

- (id) init {
    self = [super init];
    if (self != nil) {
        anObject = [[CustomObject alloc] init];
    }
    return self;
}

В Интерфейсном Разработчике у меня есть "значение" текстового поля, привязанного к "anObject.textValue".

Когда я вызываю этот метод:

[anObject setValue:@"Changed anObject.textValue!" forKey:@"textValue"];

затем текстовое поле обновляется, чтобы отразить новое значение.

Но то, что я хочу сделать, это отобразить значения из объекта, который передается после выполнения некоторой работы в другом месте приложения. Итак, что я сделал, это было:

- (void)setCustomObject:(CustomObject *)newObject {
    anObject = newObject;
}

Теперь результат этой операции, по-видимому, нарушает привязки графического интерфейса пользователя к экземпляру CustomObject (anObject), что кажется логичным, учитывая, что связанный объект был заменен другим экземпляром.

Я хочу знать, есть ли способ сохранить функциональность привязок с динамически создаваемым экземпляром CustomObject без необходимости повторной привязки каждого элемента управления программным способом через bind:toObject:forKeyPath:options: или аналогичный метод, который потребует (насколько мне известно) использовать IBOutlets, чтобы овладеть элементами управления, чтобы затем связать их со значениями в моем новом объекте (IMO, это сделало бы привязки бесполезными в моей ситуации). Это единственное решение или есть лучший, более чистый способ справиться с этим?

Я прочитал много полезных документов на developper.apple.com и в других местах, касающихся привязок, но я не нашел ничего, что могло бы говорить об этом конкретном случае.

Заранее спасибо за ваше время!

Ответы [ 2 ]

3 голосов
/ 22 сентября 2009

Если быть точным, я думаю, что проблема заключалась в том, что ваш метод установки был вызван -setCustomObject: вместо -setAnObject:. Если бы вы внесли именно это изменение, я думаю, что KVO будет вызвано, и ваши связанные текстовые поля будут обновлены.

Примечание Абизерна об утечке (если вы не используете GC) по-прежнему применимо. Вместо этого ваш сеттер должен выглядеть примерно так:

- (void)setAnObject:(CustomObject *)newObject {
    if (anObject != newObject) {
        [anObject release];
        anObject = [newObject retain];
    }
}
1 голос
/ 22 сентября 2009

Посмотрите эти документы на Наблюдение ключевого значения. Это должно показать вам, как изменить свойства в соответствии с KVO.

В качестве альтернативы, установите anObject как свойство:

@interface AppDelegate : NSObject {
    CustomObject *anObject; // This object has a "NSString *textValue" property
}
@property (retain) CustomObject *anObject;
...
@end

@interface AppDelegate
@synthesize anObject;

...
@end

Затем при изменении экземпляра anObject используйте синтаксис свойства.

self.anObject = newObject;

Это позаботится о KVO для вас.

примечание: Если у вас в GC не включен метод утечки setCustomObject:.

...