Xcode 13迁移后跨输入法菜单快捷键异常问题咨询
macOS Monterey+Xcode13菜单快捷键跨输入法显示异常问题解答
这是macOS 12(Monterey)的预期行为——Apple在该版本中调整了菜单快捷键的处理逻辑:默认情况下,NSMenuItem的快捷键会根据当前输入法对应的键盘布局,将设置的字符映射为该布局下对应物理按键的显示字符,而非保持原始设置的字符内容。
如果需要实现跨输入法保持同一快捷键的显示与触发逻辑(即无论布局如何,始终显示⌘1且对应物理按键一致),不能再依赖setKeyEquivalent:的字符绑定方式,需要改用**物理按键码(Key Code)**来实现:
实现步骤与代码示例
- 添加全局事件监听器,直接捕获指定按键组合的物理按键事件:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // 监听键盘按下事件 [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^NSEvent * _Nullable(NSEvent * _Nonnull event) { // 按键码18对应Qwerty布局的"1"键(即Azerty布局的"&"所在物理键) if ((event.modifierFlags & NSEventModifierFlagCommand) && event.keyCode == 18) { // 触发目标菜单项的动作方法 [self yourMenuItemAction]; return nil; // 阻止事件继续传递,避免冲突 } return event; }]; }
- 手动设置菜单项的显示文本,确保跨布局显示一致:
// 设置菜单项显示的快捷键文本为⌘1 [menuItem setKeyEquivalent:@"1"]; [menuItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand];
通过这种方式,实际触发逻辑绑定的是物理按键码,不受输入法布局影响;而菜单显示的快捷键文本始终保持为设置的字符,实现显示与触发的跨布局一致性。
内容的提问来源于stack exchange,提问作者dspr
相关产品推荐
相关产品推荐

