Как реализовать собственный элемент управления всплывающими окнами в Какао?

Я хочу создать собственный элемент управления автозаполнением для моего NSWindow, вроде того, что нравится в Xcode, но я не могу понять, как это сделать.

Я создал NSPanel с собственным NSWindowController и показываю его с помощью некоторого кода, например:

_popupController = [[MYPopupWindowController alloc] initWithWindowNibName: @"MYPopupPanel"];
NSPanel *popup = [_popupController window];
[popup setFrameTopLeftPoint: ...];  // location of the cursor
[popup setLevel: NSPopUpMenuWindowLevel];
[_window addChildWindow: popup ordered: NSWindowAbove];
[_popupController showWindow: sender];

Сам NSPanel имеет свой собственный подкласс, который реализует -canBecomeKeyWindow (возвращает YES), так что NSTableView во всплывающем окне может получать ключевые события.

Это работает очень хорошо. Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда мой NSPanel является ключевым окном, основное приложение NSWindow не работает (очевидно), что приводит к тому, что элементы управления красным / желтым / зеленым окном становятся тусклыми. Очевидно, что в таких программах, как Xcode, элементы управления окна не тускнеют каждый раз, когда вы начинаете вводить имя метода.

Я лаю не на то дерево? Является ли NSPanel неправильным способом создания настраиваемого всплывающего элемента управления? Или есть способ сделать NSPanel ключевым окном без того, чтобы его родительское окно (или другие окна) затемняло их элементы управления окном?

РЕДАКТИРОВАТЬ: Есть ли способ узнать, что на самом деле использует Xcode, например, NSPanel?


person user241221    schedule 22.12.2013    source источник


Ответы (1)


Попробуйте добавить NSNonactivatingPanelMask флаг к вашему NSPanel стилю (если вы используете xib, просто установите флажок «Не активировать» в инспекторе атрибутов).

person Dmitry    schedule 13.01.2014
comment
На это полезно посмотреть (спасибо!), Но проблема была не в этом. По какой-то причине, даже если NSPanel не был -canBecomeKeyWindow, он все равно будет принимать события клавиатуры (и, конечно, не испортить элементы управления родительского окна). Я не уверен, что понимаю цепочку респондентов Cocoa, но теперь она работает. - person user241221; 14.01.2014