Пересылка методов доступа к свойству методу Ивара - PullRequest
0 голосов
/ 28 ноября 2010

У меня есть панель, которая развивает выбранную строку таблицы.Очевидно, что отображение панели часто нуждается в обновлении, и я перенес эту задачу в подкласс NSWindowController.

Я бы хотел, чтобы пользовательский NSWindowController имел @property s для таких вещей, как строковые значения в текстовых полях.и значения изображения в NSImageViews.Поскольку мне не нужен новый код в методах доступа, я хочу @synthesize их.К сожалению (для меня), нет возможности использовать ключевые пути в @synthesize property=ivar.

Очевидное решение - написать свои собственные средства доступа в форме

- (void)setTitle:(NSString *)title
{
    [titleTextField setStringValue:title];
}

- (NSString *)title
{
    return [titleTextField stringValue];
}

, но я 'Я бы не хотел делать это вручную для каждого из нескольких свойств.

Есть ли более простой способ?Возможно, универсальный способ настроить свойство для пересылки определенному свойству (кроме objectValue и т. Д. На самом деле не являются правильными свойствами) другого объекта?

Ответы [ 3 ]

1 голос
/ 28 ноября 2010

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

0 голосов
/ 29 ноября 2010

У вас есть противоречие, вы говорите, что вам не нужен новый код в аксессорах, поэтому вы хотите их синтезировать, но нужный вам код совершенно новый.Свойства являются синтаксическим сахаром для нескольких распространенных случаев, из которых это не один.

Есть несколько способов сделать то, что вы хотите, например.как @Justin предлагает переопределить setvalue: forundefinedkey: - вам просто нужен поиск передовых целей, но сахар свойств не подходит для этого.

0 голосов
/ 28 ноября 2010

Я не думаю, что переадресация будет полезна, поскольку имена свойств в текстовом поле будут отличаться от имен в вашем классе.

Абстрагирование от текстового поля путем экспонирования свойства строки, конечно, является хорошей идеей, но если вы хотите избежать написания этой базовой таблицы, вы можете найти приемлемым просто выставить само текстовое поле как свойство. Это можно увидеть в некоторых API-интерфейсах Apple, особенно на iPhone, где в SDK 3.0 вместо свойств типа text в ячейке таблицы они теперь имеют textLabel. Это проще и дает больше возможностей для настройки, если вызываемый абонент хочет каким-либо образом настроить метку или текстовое поле.

...