Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法(通过IB或编程方式)为Cocoa中的菜单项分配多个等价键?_Cocoa - Fatal编程技术网

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

有没有办法(通过IB或编程方式)为Cocoa中的菜单项分配多个等价键?,cocoa,Cocoa,具体来说,我希望我的“新建”菜单项同时响应Cmd+N和Cmd+T,因为它将在选项卡中打开一个新文档。*我如何在Interface Builder中或以编程方式执行此操作 *如果需要,我可以进一步解释原因,但我希望避免讨论优点,而是关注如何做,而不是为什么做。制作第二个(最简单的方法是复制),并将其设置为隐藏。当用户打开菜单时,它不会显示,但只要它被启用,它的等价键应该仍然有效。 一个动作有两个或两个以上等价键的简单方法是复制NSMenuItem,并为这些“可选”菜单项添加一个特殊的标记 然后将A

具体来说,我希望我的“新建”菜单项同时响应
Cmd+N
Cmd+T
,因为它将在选项卡中打开一个新文档。*我如何在Interface Builder中或以编程方式执行此操作

*如果需要,我可以进一步解释原因,但我希望避免讨论优点,而是关注如何做,而不是为什么做。

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

一个动作有两个或两个以上等价键的简单方法是复制
NSMenuItem
,并为这些“可选”菜单项添加一个特殊的标记

然后将
AppDelegate
设置为相应封闭
NSMenuDelegate
(其中内部项需要更新可见性)的委托(
NSMenuDelegate

隐藏菜单项(或具有隐藏上级项的项)不会显示在中 菜单和不参与命令键匹配

NSMenu
打开时,隐藏此选项,当其关闭时,显示它们

Swift 3中的示例:
隐藏时,它似乎不响应密钥等效项。不过,我会继续研究它,因为我的代码中可能有一些东西阻止它被启用。好吧,我只是在
validateNuItem:
中显式地为它的选择器返回YES,它工作得很好。似乎我应该能够确保以更好的方式启用它。有什么想法吗?你应该观看今年WWDC的第145节:如果你有ADC帐户,即使你没有参加会议,你也应该能够观看。因为很难从在线列表中分辨出来,“第145节”被称为“可可应用程序中的关键事件处理”-通过iTunes链接:有一个NSMenuItem属性-“allowsKeyEquivalentWhenHidden:Bool”。
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)
        }
    }
}