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?