NSMenu 以编程方式选择项目

Posted

技术标签:

【中文标题】NSMenu 以编程方式选择项目【英文标题】:NSMenu programmatically select item 【发布时间】:2014-03-02 06:09:19 【问题描述】:

我正在为应用程序编写一个插件 - 自定义键盘快捷键。我可以遍历它的视图。 我需要打开弹出菜单,选择其中的项目,然后打开其子菜单并选择子菜单中的某个项目。

目前我只能通过将performClick: 发送到相关的NSPopUpButton 元素来打开顶部弹出菜单。

如何以编程方式选择菜单中的项目并打开其子菜单?

我试过了:

NSPopUpButton(以及相关的NSMenu)上致电selectItem:。不走运,我在 doc 中看到了一个概念:“请注意,当菜单跟踪用户输入时,不会反映对菜单的编程更改,例如添加、删除或更改菜单上的项目” 发送键盘事件(使用this answer)。不走运 - 可能是因为我在发送这些事件时拿着一些钥匙 通过 Accessibility API 查找有关如何操作的任何信息,但我无法找到有关如何在当前应用程序(甚至任何其他应用程序,但使用 Objective-C)上使用它的任何信息

【问题讨论】:

你也看过performClick:吗? @Volker 你是什么意思?我在NSPopUpButton 上使用performClick: 打开弹出菜单 在 nspopupbutton 上打开当前选择的菜单应该使用 performClick: 来完成,它应该在其单元格上调用 performClickWithFrame:inView:。在这种情况下,正确的方法应该是首先在 popupbutton 上选择 menuitem,然后调用 perform click。这是因为除了开/关之外,您可能会使用 performActionForItemAtIndex 意外触发自定义操作(在 menuitem 上) 【参考方案1】:

使用NSMenu方法- (void)performActionForItemAtIndex:(NSInteger)index

NSUInteger idx = [[[menuItem menu] itemArray] indexOfObject:menuItem];
[[menuItem menu] performActionForItemAtIndex:idx];

【讨论】:

【参考方案2】:

打开子菜单:performActionForItemAtIndex:

对于选择和打开菜单: selectItemAtIndex: + performClick:

不要在没有子菜单的项目上调用performActionForItemAtIndex:,因为您可能会触发可能由其他人设置的操作。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
    NSMenu *menu = self.popup.menu;
    NSMenuItem *item = [menu itemAtIndex:2];
    [item setAction:@selector(terminate:)];
    [item setTarget:NSApp];


- (IBAction)action:(id)sender 
    //[self.popup.menu performActionForItemAtIndex:2]; -> if not submenu this will quit your app
    [self.popup selectItemAtIndex:2]; //-> first select menu item
    [self.popup performClick:nil]; //-> open menu - will not quit app

【讨论】:

【参考方案3】:

除了@LCC的回答,你也可以在NSMenu上拨打indexOfItem

NSInteger index = [item.menu indexOfItem:item];
[item.menu performActionForItemAtIndex:index];

【讨论】:

以上是关于NSMenu 以编程方式选择项目的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建带有 NSMenuItems 的 NSMenu?

如何以编程方式添加 NSMenu?

我可以以编程方式打开 NSMenu 吗?

以编程方式选择winforms checkboxlist中的项目

如何以编程方式选择 WPF TreeView 中的项目?

Select2 多选 - 以编程方式取消选择/取消选择项目