Привязка пользовательского NSView: требует ли это создания IBPlugin?

Я создал подкласс 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
}

К сожалению, привязка изображения не отображается в Interface Builder.

Нужно ли мне создавать IBPlugin для выявления привязок в Interface Builder?. Это просто кажется излишним для пользовательского представления, которое я не планирую повторно использовать.

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

bind:toObject:withKeyPath:options:

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

Ответ 4

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

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

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

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

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