Отображение модального NSWindow без активации других окон приложения - PullRequest
7 голосов
/ 19 декабря 2010

У меня есть NSStatusItem, который правильно отображается в панели меню. Один из элементов (при нажатии) отображает модальное NSWindow из моего приложения, которое предназначено для выполнения одноразовой задачи, а затем исчезает. (Например, пользователь вводит небольшой текст, нажимает «Сохранить», и модальное NSWindow исчезает.)

Проблема возникает, когда приложение работает в фоновом режиме. Модальное окно правильно отображается над любым приложением, запущенным на переднем плане, но когда пользователь нажимает кнопку «Сохранить», остальные окна приложения также становятся активными. Это нежелательно, поскольку пользователь затем должен вернуться к любому приложению, которое он использовал. (Уничтожая удобство NSStatusItem.) Я отображаю модальное окно, используя:

[myWindow setFrame:finalRect display:YES animate:NO];
[myWindow setLevel:NSPopUpMenuWindowLevel];
[NSApp runModalForWindow:myWindow];

Есть ли какой-нибудь способ предотвратить щелчки / события в моем всплывающем окне, чтобы остальная часть приложения стала активной? Или способ сообщить NSApp, что эта конкретная панель не должна автоматически активировать остальную часть приложения? Спасибо!

Ответы [ 4 ]

17 голосов
/ 29 декабря 2010

Вместо создания NSWindow создайте NSPanel со стилем NSNonactivatingPanelMask.Затем вы можете сделать обычные makeKeyAndOrderFront: и orderOut:, чтобы отобразить / скрыть панель при необходимости.

1 голос
/ 17 февраля 2012

NSMpp beginModalSessionForWindow, runModalSession, endModalSession - это необходимые вам методы.

Посмотрите здесь, например, как его использовать: Создание полностью настроенного NSAlert

1 голос
/ 27 декабря 2010

Решение Кена Томасеса из списка разработчиков какао пару лет назад выглядит также применимо и здесь:

[[NSApplication sharedApplication] hide:self];
[[NSApplication sharedApplication] performSelector:@selector(unhideWithoutActivation) 
                                        withObject:nil 
                                        afterDelay:0.05];

, которое теоретически говорит приложению прятаться и показываться внизу стека окон.

Вы также можете перехватить событие щелчка мыши и использовать [NSApp preventWindowOrdering]

0 голосов
/ 29 декабря 2010

Вы можете попробовать что-то вроде:

...
if ([NSApp isHidden])
    [myWindow makeKeyAndOrderFront:self];
else
    [NSApp runModalForWindow:myWindow];
... 

и когда закончите:

...
if ([NSApp isHidden])
    [myWindow orderOut:self];
else
    [NSApp stopModal];
... 
...