Добавление настраиваемого вида на панель инструментов

Я боюсь с Cocoa в течение 2 часов без успеха. Я хочу добавить пользовательский вид на панель инструментов. Итак, я добавил NSToolbar к окну (с IB) и добавил мой взгляд (который отлично работает). IB автоматически создал NSToolbarItem. Я выполнил инструкции от Apple здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Toolbars/Tasks/AddRemoveToolbarItems.html#//apple_ref/doc/uid/20000755-BBCGJCDJ

Проблема в том, что я не знаю, что делать сейчас, представление не отображается, хотя в нем отображается метка.

Вот код, который я использую для рисования (очень просто, для тестирования)

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor blackColor] set];
    [[NSBezierPath bezierPathWithRect:self.bounds] fill];
}

Может кто-нибудь мне помочь?

Спасибо заранее.

Ответ 1

Я решил проблему.

Я помещаю свой пользовательский вид в корень nib. Я добавил классический NSToolbarItem и создал два выхода: один для пользовательского представления и один для NSToolbarItem. На -(void)awakeFromNib я вызвал setView: в NSToolbarItem с пользовательским представлением.

Согласно некоторым ресурсам в Интернете, это ошибка с Interface Builder.

Ответ 2

По словам инженера Apple в обсуждении на http://www.mail-archive.com/[email protected]/msg35673.html, в интерфейсе Builder появляется ошибка, в которой "Пользовательские представления" (созданные NSViews в IB) неправильно декодируются при использовании в качестве представления для NSToolbarItem и поэтому не отображаются на панели инструментов. Другие виды NSView, такие как NSButtons и NSBoxes, будут прекрасно работать как элементы панели инструментов: вы можете создать их в Interface Builder, а затем перетащить их на панель инструментов, чтобы сделать их элементами панели инструментов.

(Обсуждение в приведенной выше ссылке подразумевает, что ошибка сводится к тому, как "Пользовательские представления" создаются из XIB во время выполнения: using initWithFrame: вместо initWithCoder:. Обсуждение датируется 2009 годом, но это все еще не было исправлено с XCode 4.5/OS X 10.8.)

В моем случае я использовал обычный NSView для переноса набора элементов управления (ползунок тома и кнопок min/max), а не для реализации пользовательского подкласса NSView. Я смог избежать проблемы, используя NSBox в качестве контейнера вместо NSView: я сделал NSBox прозрачным, без заголовка и без полей, так что он иначе действовал точно как простая оболочка NSView. Это было немного больше работы в IB, но избавило меня от проблем с подключением вида к элементу панели инструментов программно.