双击Mac OSX中菜单栏图标的操作

时间:2016-09-08 20:26:42

标签: objective-c macos cocoa nsstatusitem

我正在编写一个显示菜单栏图标的小型Mac OSX应用程序。单击时,会弹出一个菜单。

我想对菜单栏图标进行“默认”操作。基本上,要在双击时执行操作,而不必从菜单中选择操作。

我查看了Apple文档,NSStatusItem中有一个名为doubleAction的东西,但它已被软推,并且(似乎)不起作用。更重要的是,它说使用button属性的文档,但尝试这样做会导致编译器错误如下所示:

enter image description here

非常感谢任何代码或指导,谢谢!

2 个答案:

答案 0 :(得分:2)

目前的情况(Xcode 7.3.1,OSX 10.11.4):

  • doubleAction NSStatusItem已被弃用(并且实际上并未正常工作)。
  • Apple告诉您使用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
    }
}

另外,您可以在状态栏项目

上处理鼠标右键