私は自分自身で解決策を見つけました。今は正常に動作しているようです。
これを行うには、分離ウィンドウを前面に並べてキーウィンドウにした後、次のコードではモーダルウィンドウになります(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はユーザーのやりとりだけでなく、内部の通信もブロックするだけでなく、メインウィンドウの準備に時間がかかることがあります。
- 別のフレームワークモーダルダイアログ(NSOpenPanelなど)をデタッチしたウィンドウから実行する場合は、新しいモーダルダイアログを閉じる前にデタッチされたウィンドウがキーウィンドウになります。つまり、runModalForWindowは別のウィンドウをフリーズします。つまり、閉じたウィンドウは閉じられません。
実際には、切り離されたウィンドウをモーダルウィンドウに設定することです – schen