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

问题描述 投票:0回答:2

我创建了一个只有一个窗口的游戏应用程序。应用程序的创建不需要 .xib 文件的帮助,如下所述:如何创建 GUI 并以编程方式对 Cocoa 事件作出反应?

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

 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) 当选择菜单项“Quit 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 仍然不起作用。

objective-c macos cocoa
2个回答
3
投票

尝试设置菜单项的 键等效修饰符掩码

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


0
投票

对于Swift+UIKit,可以这样完成:

internal func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
    return ---value of type NSApplication.TerminateReply---
}
© www.soinside.com 2019 - 2024. All rights reserved.