Я столкнулся с несколькими проблемами с фоновым приложением, которое использует LSUIElement = 1, чтобы скрыть свой элемент закрепления, строку меню и предотвратить его появление в переключателе приложений Command-Tab.
Кажется, это проблема только снежного барса.
Приложение помещает NSStatusItem в строку меню и при нажатии открывает меню. Выбор «Preferences ...» должен вызвать NSWindow с настройками.
Первое, что, похоже, не работает, это то, что окно не упорядочено спереди, а появляется за всеми остальными окнами приложения.
Я пытался это исправить, позвонив
[[NSApplication sharedApplication] activateIgnoringOtherApps: YES]
но это не сработало.
Через некоторое время я понял, что меню блокирует отправку сообщения в цикл выполнения, поэтому я написал другой метод на MainController и отправил сообщение с задержкой:
[self executeSelector: @selector (setFront :)
withObject: [окно предпочтений контроллера] afterDelay: 1.0];
-(void)setFront: (id) theWindow {
[[NSApplication sharedApplication]activateIgnoringOtherApps:YES];
[theWindow orderFrontRegardless];
[theWindow makeKeyWindow];
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
}
Обратите внимание на подход «отправляй каждое возможное сообщение, чтобы сделать то, что должен делать».
Это работает, в некотором роде, окно выводится на передний план поверх всех других окон из всех приложений, НО в большинстве случаев оно не активно, то есть строка заголовка неактивна. Нажатие на строку заголовка также не сделает окно активным. Нажатие внутри окна сделает его активным!?
Все это, похоже, не было проблемой в Leopard; просто вызывал activIgnoringOtherApps и заставлял ключ окна работать нормально.
В Snow Leopard есть новый API, разработанный для замены LSUIElement, который должен эмулировать его поведение:
http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html
Я играл с этим, но он только для SL, и я не смог установить LSUIElement.