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

Я борюсь с Какао в течение 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];
}

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

Заранее спасибо.

2 ответа

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

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

Согласно некоторым источникам в Интернете, это ошибка в Интерфейсном Разработчике.

По словам инженера Apple в обсуждении по адресу http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg35673.html, в Интерфейсном Разработчике есть ошибка, из-за которой создаются "Пользовательские представления" (созданы NSViews). в IB) не декодируются должным образом при использовании в качестве представления для NSToolbarItem, и поэтому не отображаются на панели инструментов. Другие виды NSView, такие как NSButtons и NSBox, будут отлично работать как элементы панели инструментов: вы можете создать их в Интерфейсном Разработчике, а затем перетащить их на панель инструментов, чтобы превратить их в элементы панели инструментов.

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

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

Другие вопросы по тегам