单击_statusItem时执行操作,使用NSMenu并且窗口不在焦点上似乎不可能

时间:2017-07-16 04:04:10

标签: cocoa nsmenu nsmenuitem nsapplication

关于SO也有类似的问题,但这有一个转折。

当用户点击位于菜单栏上的应用图标时,我需要触发操作。行动是将其窗口置于前面,换句话说,

  [[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self];

通常我会这样做:

[_statusItem setTarget:self];
[_statusItem setAction:@selector(bringToFront:)];

但此_statusItem有一个NSMenu

如果我停用该菜单,则会触发bringToFront:

所以我想,我会实施NSMenuDelegate方法menuWillOpen

- (void)menuWillOpen:(NSMenu *)menu {
  [[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self];
}

但是有一个问题。如果应用程序窗口是选定的窗口,这将有效,但假设应用程序正在运行,我选择safari。然后,我的应用程序的窗口不再是焦点,在2000 Safari窗口后面。现在,我点击菜单栏上的应用程序图标,不会触发menuWillOpen

如果我想点击菜单栏上的应用程序图标来关注窗口,必须让窗口聚焦以使其工作没有意义。

1 个答案:

答案 0 :(得分:1)

发布

NSApplication个通知以响应您的应用获得/退出活动状态。处理这些通知并启用/停用状态项的菜单,以便在您的应用处于后台时调用您的操作。