Привязка пользовательского NSView: требует ли он создания IBPlugin? - PullRequest
14 голосов
/ 03 марта 2009

Я создал подкласс NSView для рисования изображения в виде шаблона:

@interface CePatternView : NSView
{
    NSImage*    image;
    id      observableObjectForImage;
    NSString*   keyPathForImage;
}

@end

Я реализовал следующее, чтобы выставить привязки:

+ (void)initialize
{
    // Expose the "image" binding to IB.
    [self exposeBinding:@"image"];  
}

- (Class)valueClassForBinding:(NSString *)binding
{
    if([binding isEqualToString:@"image"])
        return [NSImage class];
    return nil; // Unknown binding
}

К сожалению, привязка image не отображается в Интерфейсном Разработчике.

Действительно ли мне нужно создавать IBPlugin для предоставления привязок в Интерфейсном Разработчике? Это просто кажется излишним для пользовательского представления, которое я не планирую использовать повторно.

Ответы [ 4 ]

14 голосов
/ 03 марта 2009

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

Ваш код не запускается в Интерфейсном Разработчике, если вы не поместите его в Интерфейсный Разработчик, и это сообщение exposeBinding: является вашим кодом. Поэтому вам нужно поместить его в Interface Builder. Это означает написание плагина IB.

Кроме того, подключаемые модули IB не совпадают со старыми палитрами IB. Плагины требуют IB 3 и их гораздо проще создавать. Палитры требуют IB 2, и их было больно создавать.

12 голосов
/ 25 марта 2009

Я просто связал свой объект контроллера с моим объектом просмотра, используя другое стандартное связывание (скажем, toolTip), затем отредактировал файл XIB с помощью текстового редактора и изменил XML вручную.

После этого привязка работает правильно и даже корректно отображается в Интерфейсном Разработчике для загрузки!

2 голосов
/ 03 марта 2009

Если вам удастся выполнить привязку вручную, вы сэкономите много времени. Создание пользовательских палитр IB - большая работа по сравнению с несколькими строками кода ручного связывания. Но, если ваши потребности требуют пользовательской палитры IB, я бы начал с рассмотрения того, что потребуется подклассу NSView, с точки зрения кодирования. Отличное место для начала - это сайт Кроуфорда о привязках:

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html

За последние пару лет я много использовал его, он очень помог с моими объектами палитры IB и с проблемами связывания в целом. На его сайте есть пример, подробно описывающий пользовательские NSView с пользовательскими привязками.

Что еще нужно отметить, это то, что ваш пользовательский вид также должен работать в среде Interface Builder. Есть несколько небольших исправлений, которые необходимо внести в ваш код привязок в вашем пользовательском объекте NSView, чтобы он функционировал и связывался правильно в Интерфейсном Разработчике. Эти детали также отмечены на сайте Кроуфорда:

http://homepage.mac.com/mmalc/CocoaExamples/controllers.html#ibBindings

2 голосов
/ 03 марта 2009

Нет, вы можете использовать метод

bind:toObject:withKeyPath:options:

, чтобы установить вашу привязку программно. Я считаю, что вам нужно создать палитру IB, чтобы привязки отображались в Интерфейсном Разработчике, но для одноразового класса я не собираюсь повторно использовать, я никогда не беспокоился.

...