Я вроде нашел решение сам. Теперь все работает нормально.
Для этого после того, как отдельное окно упорядочено вперед и становится окном ключа, следующий код сделает его модальным окном (где 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 по двум причинам:
- в противном случае главное окно не будет сразу заблокировано. Я пока не совсем понял причину. Одно из возможных объяснений: runModalForWindow будет блокировать не только взаимодействие с пользователем, но и внутреннюю связь, поэтому основному окну может потребоваться больше времени для готовности.
- если вы планируете запустить другое модальное диалоговое окно фреймворка (например, NSOpenPanel) из отдельного окна, то при возврате отсоединенное окно станет ключевым окном до закрытия нового модального диалога, а именно runModalForWindow заморозит другое окно, которое будет закрыто. Это означает, что закрытое окно не будет закрыто.