2012-01-13 5 views
0

MAC OS X 10.7では、NSPopoverと呼ばれる新しいクラスが導入され、そのポップオーバービューをドラッグして独立したNSWindowにすることもできます。しかし、私は分離されたウィンドウが閉じられるまでメインウィンドウへのユーザーのやりとりを防ぎたい。どうすればこのことができますか?NSPopoverのデタッチウィンドウをモーダルウィンドウにする方法

実際には、現在のフロントウィンドウが返されるまで、より一般的な(さらにはばかげた)質問があります。私はプログラミングも踏みにじるのはやめです。

+0

実際には、切り離されたウィンドウをモーダルウィンドウに設定することです – schen

答えて

1

私は自分自身で解決策を見つけました。今は正常に動作しているようです。

これを行うには、分離ウィンドウを前面に並べてキーウィンドウにした後、次のコードではモーダルウィンドウになります(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. をブロックされることはありません。私はまだその理由が分からない。 1つの考えられる説明は:runModalForWindowはユーザーのやりとりだけでなく、内部の通信もブロックするだけでなく、メインウィンドウの準備に時間がかかることがあります。
  2. 別のフレームワークモーダルダイアログ(NSOpenPanelなど)をデタッチしたウィンドウから実行する場合は、新しいモーダルダイアログを閉じる前にデタッチされたウィンドウがキーウィンドウになります。つまり、runModalForWindowは別のウィンドウをフリーズします。つまり、閉じたウィンドウは閉じられません。
関連する問題