Привязка пользовательского NSView:Требуется ли создание IBPlugin?
-
03-07-2019 - |
Вопрос
Я создал подкласс 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? Это кажется излишним для пользовательского представления, которое я не планирую использовать повторно.
Решение
Ответ на заголовок:Нет, вы можете привязать пользовательское представление без подключаемого модуля IB (сделав это в коде).
Ответ на вопрос в теле вопроса:Да, вам нужен плагин IB, чтобы предоставить привязку в IB.
Ваш код не запускается внутри Interface Builder, если вы не поместите его в Interface Builder, и это exposeBinding:
сообщение — это ваш код.Поэтому вам нужно поместить его в Interface Builder.Это означает написание плагина IB.
Кроме того, плагины IB отличаются от старых палитр IB.Плагины требуют IB 3, и их гораздо проще создавать.Палитры требуют IB 2, и создавать их было сложно.
Другие советы
Я просто привязал свой объект контроллера к своему объекту представления, используя другую стандартную привязку (скажем, всплывающую подсказку), затем отредактировал файл XIB с помощью текстового редактора и изменил XML вручную.
После этого привязка работает правильно и даже корректно отображается в Interface Builder при загрузке!
Нет, вы можете использовать метод
bind:toObject:withKeyPath:options:
чтобы установить привязку программно.Я считаю, что вам нужно создать палитру IB, чтобы привязки отображались в Interface Builder, но я никогда не беспокоился о одноразовом классе, который я не собираюсь использовать повторно.
Если вам удастся выполнить привязку вручную, вы сэкономите много времени.Создание пользовательских палитр 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