当前位置: 首页 > 知识库问答 >
问题:

如何创建一个NSMenu包含一个NSMenuItem,它只在持有键盘修改键时出现?

计燕七
2023-03-14

我想创建一个NSMenu,其中包含默认情况下隐藏的NSMenuItem,并且仅在用户按住键盘修改键时显示。

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

我已经尝试使用[NSEvent addglobalmonitor foreventsmatchingmask:handler://code>安装密钥侦听器,通过设置hidden属性以编程方式隐藏和取消隐藏NSMenuItem。这种方法是有效的,但问题是当NSMenu打开时隐藏/取消隐藏将不起作用。显然,NSMenu在打开时完全接管事件处理循环,从而阻止键侦听器工作
NSMenu打开时,我可能会使用CGEventTap来接收事件,但这似乎完全是过火了。

我发现的另一个与我想要的功能类似的功能是NSMenu的“替代”机制。但我只能让它关闭NSMenuItems,而不能隐藏它们。

任何帮助都将不胜感激。谢谢


共有2个答案

常翰
2023-03-14

我找到了一个表现完美的解决方案!

>

  • 在要隐藏的NSMenuItem上,将alternate属性设置为YES,并将keyEquivalentModifierMask属性设置为要取消隐藏该项的键盘修改器。

    在您的NSMenu中,就在您想要隐藏的NSMenuItem之前,插入另一个高度为0的NSMenuItem

    在Objc中,您可以创建高度为0的NSMenuItem,如下所示:

    objectivec prettyprint-override">NSMenuItem *i = [[NSMenuItem alloc] init];
    i.view = [[NSView alloc] initWithFrame:NSZeroRect];
    

    可隐藏的NSMenuItem现在将替代它前面的零高度NSMenuItem。默认情况下将显示零高度项,但当您持有指定的键盘修饰符时,零高度项将与可隐藏项交换。因为零高度项目是不可见的,这具有解除隐藏可隐藏项目的效果。

  • 岳华灿
    2023-03-14

    假设您的仅选项菜单项的操作是(在Swift中)performOptionOnlyMenuItem(_:),其目标是您的App委托

    >

  • 您需要做的第一件事情是确保App委托符合NSMenuItemValidation协议。

    您需要做的第二件事是实现validateMenuItem(_:)方法,并让它检查菜单项是否发送performOptionOnlyMenuItem(_:)操作。如果是,则根据当前是否按下选项键来设置项的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
            }
        }
    }
    

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

  •  类似资料:
    • 我成功创建了一个包含1个键和2个值的查找表: 但当我试图将其扩展到4个值时,我发现了一系列错误,我发现条目仅限于2个值! 那么,请,如何对1个键和4个值做类似的事情?我不能通过为第一个映射的第二个参数声明内部map.entry来扩展它。条目,因为在这一点上,第一个字符串不再是唯一的,我是说,映射的所有参数。条目 你们不需要走我走的路。你们可以自由地提供任何解决方案/数据结构,允许我存储和检索3个字

    • 我有一个二维整数数组。我想把它们放入一个散列图。但我希望基于数组索引访问来自HashMap的元素。类似于: 对于[2][5],,该map.get(2,5)返回与该键关联的值。但是我如何创建一个带有一对键的hashMap呢?或者通常使用多个键:,我可以使用get(key1,key2,...keyN)访问元素。 编辑:三年后,张贴的问题,我想添加一点更多 我遇到了的另一种方式。 数组索引、和可以通过以

    • 我正在尝试修改哈希映射。“value”是由逗号分隔的值组成的单个字符串。(例如:“aid=abc,bid=def,cid=gh2”) 我需要用DB中的相应值替换它们中的特定值。(例如,将bid更改为123,这将导致上述“值”字符串为:“aid=abc,bid=123,cid=gh2”) 然后将修改后的“value”设置为相应的键,以便hashmap由修改后的值组成。 我尝试遍历键,并使用将给出值的

    • 我已将我的UIkeyboarddismissmode设置为。交互式,我不知道如何调整UITextView的大小,以便键盘不会覆盖内容。我还有一个UIToolbar作为输入附件。 这是我的密码。 上面的代码只会使文本视图以一种奇怪的方式移动,我不知道如何达到消息应用程序那样的效果。 更新时间: 我把代码改为上面的。但有时,当我将键盘松开一半时,scrollView会突然弹到底部,这很奇怪。有什么建议

    • 我正在使用为Redis添加和检索数据。但一旦数据写入redis,我可以看到多个键,而不是一个。到期时,只有一个密钥被移除,其余的密钥仍然存在于Redis中。 要保存, 但是当我打开并运行时,我可以看到, 在设置之后,如果再次运行相同的命令,我可以看到, 这些附加密钥是什么,以及为什么使用完整包名和随机唯一标识符创建这些密钥。 谢谢

    • 我有一个像这样的rdd 来自评论: 这是我尝试的: