如果有菜单,则检测单击NSStatusItem的时间?

时间:2012-11-05 22:52:08

标签: objective-c macos cocoa menu nsstatusitem

点击后,我有NSStatusItem下拉菜单:

[statusItem setMenu:statusMenu];

由于我正在使用菜单,因此此代码无法检测何时单击状态项:

[statusItem setAction:@selector(isClicked:)];

如何使用菜单但同时知道单击状态项?

1 个答案:

答案 0 :(得分:6)

要完成此操作,您需要为菜单设置委托。

首先,在接口文件(.h)中将类设置为NSMenu的委托。例如:

@interface MyClass : NSObject <NSMenuDelegate>
. . .
@end

然后在实现文件(.m)中初始化状态项时使用这样的代码:

//your status item initialization code. Then:
[statusItem setMenu:statusMenu];
[statusMenu setDelegate:self];

如果您愿意,可以给菜单添加标题(如果您在Interface Builder中创建了菜单,则可以在“属性检查器”下的Xcode Interface Builder中完成)。这样做是为了消除与其他菜单的差异。

然后将此方法添加到类的实现(.m)文件中:

-(void)menuWillOpen:(NSMenu *)menu{
    if([[menu title] isEqualToString:@"Menu's title"]){
        //RUN CODE WHEN STATUS ITEM IS CLICKED
    }
}

就是这样!您甚至可以使用以下代码来检测菜单何时关闭:

-(void)menuDidClose:(NSMenu *)menu{
    if([[menu title] isEqualToString:@"Menu's title"]){
        //RUN CODE WHEN MENU IS CLOSED
    }
}

即使您使用菜单,现在也可以知道何时单击状态项。