有没有办法(通过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)
}
}
}