显示工作表时可用的主菜单

时间:2010-04-25 17:34:22

标签: cocoa modal-dialog nsmenu nsalert cocoa-sheet

如何对通过鼠标点击或通过键盘调用的菜单项做出反应,例如: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 个答案:

答案 0 :(得分:1)

我假设你正在使用NSApp的-beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:方法。如果是这样,那么你已经可以做菜单命令了。该方法仅运行给定窗口的工作表模态(而不是整个应用程序的模态)。但是,如果您还调用NSApp的-runModalForWindow:,那么它将是整个应用程序的模态。因此,假设您没有调用它,那么当工作表显示时,其他窗口和菜单命令应该可以正常工作。

但是,“退出”菜单项是一个例外。它不会让你退出,因为窗口有一个活动的模态会话,它假设需要在应用程序退出之前处理。如果这是您真正想要做的,那么一个可能的解决方案是子类NSApplication并覆盖其-terminate:方法以首先关闭工作表(如果它已打开)。首先,您需要创建NSApplication的子类,并让您的应用程序通过在'MainMenu.xib'中设置它并在'Info.plist'中设置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];
}