Используемое главное меню, когда лист показан - PullRequest
0 голосов
/ 25 апреля 2010

Как реагировать на элементы меню, которые нажимаются мышью или вызываются с помощью клавиатуры, например: 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];

1 Ответ

1 голос
/ 25 апреля 2010

Полагаю, вы используете метод NSApp -beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:. Если это так, то вы уже сможете выполнять команды меню. Этот метод запускает модальный лист только для данного окна (в отличие от модального для всего приложения). Однако, если вы также вызовете NSApp -runModalForWindow:, это будет модальным для всего приложения. Итак, если вы не вызываете это, тогда другие окна и команды меню должны нормально работать, когда лист показывает.

Однако пункт меню «Выход» является одним исключением. Это не позволит вам выйти, потому что для окна активен модальный сеанс, который, как предполагается, должен быть обработан до того, как приложение сможет выйти. Если это то, что вы действительно пытаетесь сделать, то одним из возможных решений является создание подкласса NSApplication и переопределение его метода -terminate:, чтобы сначала закрыть свой лист (если он открыт). Во-первых, вам нужно сделать подкласс NSApplication, и ваше приложение должно использовать его, установив его как в «MainMenu.xib» и как Principal Class в «Info.plist»). Затем добавьте что-то вроде этого в ваш подкласс:

- (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];
}
...