gpt4 book ai didi

macos - 如何创建一个包含仅在按住键盘修改键时出现的 NSMenuItem 的 NSMenu?

转载 作者:行者123 更新时间:2023-12-04 07:56:07 26 4
gpt4 key购买 nike

我想创建一个包含 NSMenuItemNSMenu,它在默认情况下是隐藏的,并且仅在用户按住键盘修改键时出现。

基本上,我正在寻找与 Finder 的“开始”菜单中的“库”选项相同的行为:

不持有 Option (⌥): enter image description here

按住 Option (⌥): enter image description here


我已经尝试使用 [NSEvent addGlobalMonitorForEventsMatchingMask: handler:] 安装一个关键监听器,通过将其设置为 hidden 以编程方式隐藏和取消隐藏 NSMenuItem属性(property)。这种方法可行,但问题是当 NSMenu 打开时隐藏/取消隐藏不起作用。显然 NSMenu 在打开时完全接管了事件处理循环,阻止了关键监听器的工作。
NSMenu 打开时,我可能可以使用 CGEventTap 来接收事件,但这似乎完全矫枉过正。

我发现的另一个与我想要的类似的东西是'alternate ' NSMenu 的机制。但我只能让它切换出 NSMenuItems,而不是隐藏/取消隐藏它们。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

假设您的仅选项菜单项的操作是(在 Swift 中)performOptionOnlyMenuItem(_:) 并且它的目标是您的 AppDelegate

  • 您需要做的第一件事是确保 AppDelegate 符合 NSMenuItemValidation 协议(protocol)。

  • 您需要做的第二件事是实现 validateMenuItem(_:) 方法,并让它检查菜单项是否发送 performOptionOnlyMenuItem(_:) Action 。如果是,则根据当前是否按下选项键设置项目的 isHidden 属性。

如果您不需要验证任何其他菜单项,代码可以如下所示:

extension AppDelegate: NSMenuItemValidation {
func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
switch menuItem.action {
case #selector(performOptionOnlyMenuItem(_:)):
let flags = NSApp.currentEvent?.modifierFlags ?? []
menuItem.isHidden = !flags.contains(.option)
return true
default:
return true
}
}
}

如果将操作发送到其他某个目标,您需要在该目标上实现验证(包括协议(protocol)一致性)。每个菜单项仅由项目的目标验证。

关于macos - 如何创建一个包含仅在按住键盘修改键时出现的 NSMenuItem 的 NSMenu?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66693872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com