マウスでクリックされた、またはキーボードで呼び出されたメニュー項目にどのように反応しますか。例:CMD + Q?
[NSApp beginSheet:my_sheet ...arguments... ];
/*
The sheet is now shown and the mainmenu isn't usable.
How does one make it usable?
*/
[NSApp endSheet:my_sheet returnCode:0];
マウスでクリックされた、またはキーボードで呼び出されたメニュー項目にどのように反応しますか。例:CMD + Q?
[NSApp beginSheet:my_sheet ...arguments... ];
/*
The sheet is now shown and the mainmenu isn't usable.
How does one make it usable?
*/
[NSApp endSheet:my_sheet returnCode:0];
NSAppの-beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:
メソッドを使用していると思います。もしそうなら、あなたはすでにメニューコマンドを行うことができるはずです。このメソッドは、(アプリ全体のモーダルではなく)指定されたウィンドウに対してのみシートモーダルを実行します。ただし、NSAppも呼び出すと-runModalForWindow:
、アプリ全体でモーダルになります。したがって、それを呼び出さないと仮定すると、シートが表示されているときに他のウィンドウやメニューコマンドが正常に機能するはずです。
ただし、「終了」メニュー項目は1つの例外です。ウィンドウに対してアクティブなモーダルセッションがあるため、終了できません。これは、アプリを終了する前に処理する必要があると想定しています。これが本当にやろうとしていることである場合、考えられる解決策の1つは、NSApplication
そのメソッドをサブクラス化してオーバーライドし-terminate:
、最初にシートを閉じることです(シートが開いている場合)。まず、のサブクラスを作成し、「MainMenu.xib」と「Info.plist」のNSApplication
両方で設定して、アプリに使用させる必要があります。Principal Class
次に、次のようなものをサブクラスに追加します。
- (void)terminate:(id)sender
{
// First close the sheet (if it's active), using whatever method
// you have set up to do this...
[((MyAppDelegate*)[self delegate]) closeSheet:self];
// Now call the normal implementation
[super terminate:sender];
}