Я работаю над приложением без док-станции (LSUIElement
true).В приложении появляется меню, когда пользователь нажимает на соответствующий NSStatusItem
или когда используется сочетание клавиш.
Моя проблема заключается в том, что все методы, вызывающие всплывающее меню, программно зависают при каждом переключении пользователя на другое.приложение (используя ⌘-TAB), не закрывая меню в первую очередь.Я пробовал popUpMenuPositioningItem:atLocation:inView:
, popUpContextMenu:withEvent:forView:
и соответствующий метод на NSStatusItem
(popUpStatusItemMenu:
).
Если пользователь закрывает меню с помощью клавиши ESC, все работает нормально, но если пользователь переключаетсяв другое приложение вышеупомянутые методы никогда не возвращаются (кажется, они работают синхронно и возвращаются, когда меню закрывается).Приложение не аварийно завершает работу, и есть несколько приемов, чтобы восстановить контроль (вызов разоблачения или нажатие на любой NSStatusItem
, который открывает меню).
Проблема исчезает, если в приложении есть значок закрепления(т. е. установка LSUIElement
в значение false).
Этот код появляется в меню при использовании сочетания клавиш:
[mainMenu popUpMenuPositioningItem:[mainMenu itemAtIndex:0]
atLocation:[NSEvent mouseLocation]
inView:nil];
И этот код отображается в меню, когдаNSStatusItem
нажимается:
- (void)mouseDown:(NSEvent *)event
{
[statusItem popUpStatusItemMenu:[statusItem menu]];
}
Метод mouseDown:
находится в пользовательском NSView
, прикрепленном к NSStatusItem
.
Есть идеи, как это исправить?
Спасибо за вашу помощь.
Обновление
Проблема также связана с активацией приложения (я использую [NSApp activateIgnoringOtherApps:YES];
перед отображением меню, или в некоторых случаях этоневозможно перемещаться по меню с помощью клавиатуры).