2016-09-08 2 views
1

Я пишу небольшое приложение Mac OSX, которое отображает значок панели меню. При нажатии открывается всплывающее меню.Дважды щелкните действие для значка строки меню в Mac OSX

Я хотел бы иметь действие по умолчанию для значка панели меню. В принципе, для выполнения действия при двойном щелчке по нему, без необходимости выбирать действие из меню.

Я просмотрел документы Apple, и есть такая вещь в NSStatusItem под названием doubleAction, но она мягкая, устарела и не работает (кажется). Более того, эти документы он говорит использовать button свойство, но при попытке сделать это приводит к ошибке компилятора показано ниже:

enter image description here

Любой код или руководство очень ценятся, спасибо!

+0

Я думаю, что это значит установить действие на кнопке. Не doubleAction. – rocky

+0

Конечно, но это однократное действие - не двойной щелчок. В один клик появляется меню, и все в порядке. Я хочу иметь возможность добавить действие для двойного щелчка. – DarkByte

ответ

2

Ситуация, как она стоит сегодня (Xcode 7.3.1, OSX 10.11.4):

  • doubleAction из NSStatusItem осуждается (а НЕ на самом деле работает).
  • Apple советует использовать свойство button - но нет заголовка для doubleAction (интересно, существует ли реализация). О, это также доступно только для чтения.
  • нет других вариантов касательно левого/правого/двойного щелчка в любом из свойств NSStatusItem.

обходной путь: создать категорию для NSButton (точно такой же, что Apple, говорил о) и реализовать собственный обработчик щелчка, который отправляет уведомление, когда двойной щелчок был обнаружен, как следующее:

@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 и рассматриваю его как двойной щелчок.

Надеюсь, это поможет!

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 
    } 
} 

также можно обработать правую кнопку мыши на элементе строки состояния

Смежные вопросы