我正在编写一个显示菜单栏图标的小型Mac OSX应用程序。单击时,会弹出一个菜单。
我想对菜单栏图标进行“默认”操作。基本上,要在双击时执行操作,而不必从菜单中选择操作。
我查看了Apple文档,NSStatusItem
中有一个名为doubleAction
的东西,但它已被软推,并且(似乎)不起作用。更重要的是,它说使用button
属性的文档,但尝试这样做会导致编译器错误如下所示:
非常感谢任何代码或指导,谢谢!
答案 0 :(得分:2)
目前的情况(Xcode 7.3.1,OSX 10.11.4):
doubleAction
NSStatusItem
已被弃用(并且实际上并未正常工作)。button
属性 - 但doubleAction
没有标题(我想知道是否存在实现)。哦,它也是只读的。NSStatusItem
的任何属性中没有关于左/右/双击的其他选项。解决方法:为NSButton创建一个类别(与Apple所说的完全相同),并实现一个自定义点击处理程序,在检测到双击时发布通知,如下所示: / p>
@implementation NSButton (CustomClick)
- (void)mouseDown:(NSEvent *)event {
if (self.tag != kActivateCustomClick) {
[super mouseDown:event];
return;
}
switch (event.clickCount) {
case 1: {
[self performSelector:@selector(callMouseDownSuper:) withObject:event afterDelay:[NSEvent doubleClickInterval]];
break;
}
case 2: {
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self];
[[NSNotificationCenter defaultCenter] postNotificationName:@"double_click_event" object:nil];
break;
}
}
}
- (void)callMouseDownSuper:(NSEvent *)event {
[super mouseDown:event];
}
@end
如您所见,此处理程序仅处理具有特定NSButton
值的tag
个实例。
当检测到点击时,我将呼叫推迟到super
,以便按系统的双击间隔进行处理。如果在这段时间内我收到另一次点击,我会取消对super
的通话,并将其视为双击。
希望它有所帮助!
答案 1 :(得分:0)
您可以使用NSApp.currentEvent
self.statusItem.button.target = self;
self.statusItem.button.action = @selector(clickOnStatusItem:);
...
- (void)clickOnStatusItem:(id)sender {
if (NSApp.currentEvent.clickCount == 2) {
// Double click on status item
}
}
另外,您可以在状态栏项目
上处理鼠标右键