2014-06-20 19 views
1

我有一个只有菜单栏图标的应用程序。 Menubar icon
我能听menubar项目:(IBAction) preferencesMenuItemClick:(id)sender Menubar itemObjective C - 菜单栏图标点击事件

但我怎么能听的菜单栏图标本身?
它没有可用的已发送操作。
XCode Sent Actions

感谢您的帮助。

+0

你可以显示你的意思_menu酒吧icon_什么截图? – nburk

+0

如果您能够接收菜单栏图标的事件,并且您的目标菜单栏图标是这些菜单栏图标的一部分,那么您还会收到目标菜单栏图标的事件?我不是很明白,能否提供更多信息? – nburk

+0

嘿,尼古拉斯,我刚刚更新了这个问题。现在更容易理解吗? –

回答

2

如果你只是想获得通知当用户点击菜单栏图标(这实际上是状态项),你可以使用NSMenuDelegatemenuWillOpen:方法。这将在状态菜单打开时被调用,与点击状态项本身相同。

请注意,这只适用于如果您使用菜单状态项目。如果您正在使用NSView或任何其他可能的组合,则必须使用类似的方法(loadView)。

参考:https://developer.apple.com/library/mac/documentation/cocoa/reference/NSMenuDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSMenuDelegate/menuWillOpen

+0

非常感谢。如果你知道如何,生活可以变得如此简单;) –

+0

请注意,'-menuWillOpen:'会出现在除了实际点击鼠标按钮之外的其他地方。例如,键盘导航或VoiceOver。 –

1

NSStatusItem具有setAction:方法,它设置在单击接收器时被发送到接收器的目标的选择器。

- (void)setAction:(SEL)action 

然而,这会导致问题,如果状态的项目有一个菜单:

如果接收器有一个菜单设置,动作不会被发送到接收器被点击的目标;相反,点击会导致菜单出现。

为了解决这个问题,你可以用你action选择要执行的操作或手动显示的菜单:

[self.statusItem setAction:@selector(menuAction:)]; 

... 

- (void)menuAction:(id)sender { 
    if (...) { 
     NSLog(@"Perform non-menu action!"); 
    } else { 
     NSLog(@"Manually open the menu!"); 
     [self.statusItem popUpStatusItemMenu:menu]; 
    } 
}