2009-03-03 7 views
14

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

@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? Это просто кажется излишним для пользовательского представления, которое я не планирую повторно использовать.

ответ

14

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

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

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

+0

Кто-нибудь знает, что такое состояние с Xcode 6 ..? – Jay

+0

@Jay: Для привязок я не думаю, что это изменилось: вы можете создавать новые проверяемые свойства, но они не будут отображаться как Bindings AFAIK. Возможно, я ошибаюсь - вы можете задать новый вопрос, специфичный для Xcode 6 и более поздних версий. –

2

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

bind:toObject:withKeyPath:options:

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

+0

Я знаю, что могу связать программно, но на самом деле мне действительно нужно сделать это в IB. В любом случае, спасибо за ваш ответ, Алекс. –

2

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

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

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

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

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

12

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

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

+1

Я просто сделал это сам, потому что я не хотел делать IB Plugin. +1! – 2010-03-09 14:52:58

+0

Поскольку Xcode 4 отказался от поддержки плагинов IB, похоже, что это лучший вариант, если вы не хотите делать это в своем коде приложения. http://www.cocoabuilder.com/archive/cocoa/307371-how-does-apple-want-us-to-deal-with-custom-elements-in-xcode-4-with-ibplugins-having-been- killed.html # 307599 –

+0

Фантастическое решение! Намного легче редактировать, чем я ожидал, и как только вы его вытащили, он отлично выглядит в IB. Спасибо! – andyvn22