有没有办法在Cocoa中为菜单项分配多个键等价物(通过IB或以编程方式)?

时间:2010-10-23 20:27:59

标签: cocoa

具体来说,我希望我的“新”菜单项能够响应Cmd+NCmd+T,因为它会在选项卡中打开一个新文档。*如何在Interface Builder中执行此操作编程?

*如果需要,我可以进一步解释推理,但我希望避免讨论优点,而是专注于如何做,而不是为什么要这样做。

2 个答案:

答案 0 :(得分:4)

制作第二个(最简单的方法是复制它)并将其设置为隐藏。当用户拉开菜单时它不会显示,但只要启用它,它的等效键应该仍然有效。

答案 1 :(得分:1)

enter image description here

为某个操作设置两个或更多关键等价项的简单方法是复制NSMenuItem并为这些&添加一个特殊的标记 #34;替代品" 菜单项。

然后设置AppDelegate相应封闭NSMenuDelegate的委托(NSMenu)(内部项目需要更新可见性的位置)。

  

隐藏的菜单项(或具有隐藏的超级项目的项目)不会出现   菜单和不参与命令键匹配

NSMenu打开时,隐藏此选项会替换NSMenuItem,当它关闭时,会显示它们。

Swift 3中的示例:

class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        NSApp.mainMenu?.item(withTitle: "View")?.submenu?.item(withTitle: "Zoom")?.submenu?.delegate = self
    }

    func toggleVisibility(_ visible: Bool, ofAlternatesKeyEquivalentsItems items: [NSMenuItem]) {
        for item in items.filter({ $0.tag == 2 }) {
            item.isHidden = !visible
        }
    }

    func menuWillOpen(_ menu: NSMenu) {
        if menu.title == "Zoom" {
            toggleVisibility(false, ofAlternatesKeyEquivalentsItems: menu.items)
        }
    }

    func menuDidClose(_ menu: NSMenu) {
        if menu.title == "Zoom" {
            toggleVisibility(true, ofAlternatesKeyEquivalentsItems: menu.items)
        }
    }
}