在Cocoa应用程序中处理Cmd-Q(以编程方式处理菜单项'退出应用程序')

时间:2012-02-06 02:30:35

标签: objective-c macos cocoa

我创建了一个只有一个窗口的游戏应用程序。应用程序是在没有.xib文件帮助的情况下创建的,如下所述:How can I create a GUI and react to Cocoa events programmatically?

现在,我可以在应用程序的主循环中捕获标准的“键上/下”事件:

 NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES];
 NSEventType eventType = [event type];
 if (eventType == NSKeyDown)
 {
    my_uint32 keycode = [event keyCode];
    input::doSomeWork(keycode);
 }

此外,当使用以下代码在窗口上按下红叉时,我可以正确退出应用程序:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    g_myEngine.stop();
    return NSTerminateNow;
}

但我该怎么做:

a)选择菜单项“退出MyApplicationName”时捕获?

b)处理Cmd-Q事件?


更新: 我添加了这段代码:

id menubar = [[NSMenu new] autorelease];
id appMenuItem = [[NSMenuItem new] autorelease];
[menubar addItem:appMenuItem];
[NSApp setMainMenu:menubar];
id appMenu = [[NSMenu new] autorelease];
id appName = [[NSProcessInfo processInfo] processName];
id quitTitle = [@"Quit " stringByAppendingString:appName];
id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
[appMenu addItem:quitMenuItem];
[appMenuItem setSubmenu:appMenu];

现在应用程序退出菜单,但Cmd-Q仍然无法正常工作。

1 个答案:

答案 0 :(得分:3)

尝试设置菜单项key equivalent modifier mask

不要忘记添加关闭窗口,最小化,隐藏,进入/退出全屏等菜单项,以及整个编辑菜单,包括所有文本编辑功能,当前和未来。 (为什么选择编辑菜单?我认为,至少,您可以让用户命名他们的保存游戏,他们的高分(如果适用)或他们的角色。如果你有任何文字编辑 在应用程序中,您应该支持完整的“编辑”菜单。)