Всплывающее окно не скрывается при открытии другого всплывающего окна NSView из строки состояния

Я нашел этот проект, который почти идеально работает в качестве основы для того, что я пытаюсь сделать https://github.com/shpakovski/Popup. Он помещает значок в строку меню, при нажатии на который отображается всплывающее окно. Всплывающее внутреннее окно NSWindow управляется его делегатом, который называется PanelController. Его методы делегата выполняются большую часть времени, как и ожидалось, например, уведомление (void)windowDidResignKey:(NSNotification *) выполняется, когда я нажимаю практически в любом месте. Тем не менее, он не выполняется в первый раз, когда я нажимаю другой элемент строки меню, например элемент скайпа. Вот что я получаю:

введите здесь описание изображения

Любые идеи о том, какой метод делегата NSWindow мне не хватает, чтобы перехватить этот первый щелчок по другому элементу строки меню?


person Laureano Bonilla    schedule 03.12.2013    source источник


Ответы (1)


Простое открытие меню не приводит к отмене ключа/главного окна, а открытие меню из пункта статуса работает так же, как открытие собственного меню.

Я смог найти только один случай, когда меню может заставить окно закрыть окно, когда приложение не является активным (я нахожу это немного странным, что это даже возможно). Итак, если вашему приложению не нужны собственные окна, кроме всплывающего окна, вы можете заставить его терять фокус при запуске, используя, например, (или, может быть, даже с небольшой задержкой, чтобы убедиться, что приложение было деактивировано и фокус был передан другим применение):

-(void)applicationDidBecomeActive:(NSNotification *)notification
{
    [[NSApplication sharedApplication] hide:nil]; 
}
person Rychu    schedule 13.01.2014
comment
спасибо за ответ, но это не сработает, так как у моего приложения есть свои окна, помимо всплывающего окна. - person shaish; 14.01.2014
comment
хорошо, в этом случае я могу придумать правильное решение - использовать меню со встроенным объектом, но это может быть проблематично, уродливое решение - вызвать hide: и unhideWithoutActivation, если ваше приложение открыто, или еще хуже решение - запустить два экземпляра, где один будет отвечать за окна, а второй за меню. Также обратите внимание, что если вы возьмете приложение, использующее аналогичные компоненты (хорошим примером является Dropbox), откроете какое-либо окно (в данном случае настройки), у вас будет та же проблема, что и здесь - всплывающее окно не закрывается меню. - person Rychu; 15.01.2014
comment
@Rychu, но всплывающее окно обычно закрывается меню. Это только в самый первый раз, когда приложение запускается, оно не работает (уведомление windowDidResignKey так и не было получено). Как только всплывающее окно открыто и вы щелкаете за его пределами, чтобы закрыть его, все начинает работать правильно, и уведомление windowDidResignKey поступает каждый раз, когда вы открываете меню другого приложения. - person danielv; 15.01.2014
comment
@Danielv - это потому, что всплывающее приложение больше не является активным. Добавление окна вернет проблему — просто нажмите на окно, а затем используйте всплывающее окно. - person Rychu; 16.01.2014
comment
@Rychu - не уверен, что вы имеете в виду, добавляя окно. В этом примере всплывающего приложения, когда я щелкаю за пределами всплывающего окна, я не могу снова вызвать проблему. Кроме того, вызов [NSApp deactivate] или его скрытие должно было имитировать такое же поведение и решить проблему, но это не так. - person danielv; 16.01.2014