Как сделать отдельное окно NSPopover модальным - PullRequest
2 голосов
/ 13 января 2012

В MAC OS X 10.7 Apple представила новый класс под названием NSPopover, и вы даже можете перетащить этот всплывающий вид, чтобы стать независимым NSWindow.Однако я хочу предотвратить взаимодействие пользователя с главным окном, пока отдельное окно не закроется.Как я могу безопасно это сделать?

На самом деле, более распространенный (и еще более глупый) вопрос должен состоять в том, как предотвратить любое взаимодействие с пользователем, пока не вернется текущее переднее окно?Я новичок в том, что касается программирования.

1 Ответ

3 голосов
/ 13 января 2012

Я вроде нашел решение сам. Теперь все работает нормально.

Для этого после того, как отдельное окно упорядочено вперед и становится окном ключа, следующий код сделает его модальным окном (где currModalSession - это iVar, определенный мной).

- (void)windowDidBecomeKey:(NSNotification *)notification {
    if (notification.object == detachedWindow) {
        if (!detachedWindow.isModalPanel) {
            currModalSession = [NSApp beginModalSessionForWindow:detachedWindow];
            [NSApp runModalSession:currModalSession];
        }
    }
}

Кроме того, вы должны завершить каждый модальный сеанс, который вы открыли. Таким образом, следующий код выполняет свою работу:

- (void)windowWillClose:(NSNotification *)notification {
    if (notification.object == detachedWindow) {
        if (currModalSession) {
            [NSApp endModalSession:currModalSession];
        }
    }
}

Примечание: здесь вы должны использовать модальный сеанс, а не runModalForWindow по двум причинам:

  1. в противном случае главное окно не будет сразу заблокировано. Я пока не совсем понял причину. Одно из возможных объяснений: runModalForWindow будет блокировать не только взаимодействие с пользователем, но и внутреннюю связь, поэтому основному окну может потребоваться больше времени для готовности.
  2. если вы планируете запустить другое модальное диалоговое окно фреймворка (например, NSOpenPanel) из отдельного окна, то при возврате отсоединенное окно станет ключевым окном до закрытия нового модального диалога, а именно runModalForWindow заморозит другое окно, которое будет закрыто. Это означает, что закрытое окно не будет закрыто.
...