Удалить выделение из NSMenuItem после нажатия? - PullRequest
4 голосов
/ 29 мая 2011

Я добавил пользовательский вид в мой подкласс NSMenuItem (который находится в NSStatusMenu), что означает, что по умолчанию он не будет выделен голубым / серым фоном.

Я реализовал этоиспользуя следующий код:

- (void)drawRect:(NSRect)rect {
  BOOL isHighlighted = [menuItem isHighlighted];
  if (isHighlighted) {
    [[NSColor selectedMenuItemColor] set];
    [NSBezierPath fillRect:rect];
    [menuItem addHover];
  } else {
    [super drawRect:rect];
    [menuItem removeHover];
  }
}

- (void)mouseUp:(NSEvent*)event {
  NSMenuItem *item = [self enclosingMenuItem];
  NSMenu *menu = [item menu];
  [menu cancelTracking];
  [menu performActionForItemAtIndex:[menu indexOfItem:item]];
}

Элементы меню выделены отлично, и я также могу нажать на каждый элемент;однако, когда я нажимаю на них, они, кажется, сохраняют состояние isHighlighted после повторного открытия меню.

Есть ли способ изменить его, поэтому, когда я нажимаю, выделенное состояние удаляетсякогда я в следующий раз открою меню?

Ответы [ 4 ]

2 голосов
/ 13 сентября 2011

Думает, что мы должны сделать это вместо простого NSMenuItem setHighlighted или NSMenu removeHighlights, или чего-то еще. Вот фрагмент кода, который очень похож на ответ MrWalker-а. Он просто удаляет ваш собственный элемент меню из меню и возвращает его обратно.

    NSMenuItem *selfmi = [self enclosingMenuItem];
    NSMenu* menu = [[self enclosingMenuItem] menu];

    int i = [menu indexOfItem:selfmi];
    [menu removeItemAtIndex:i];
    [menu insertItem:selfmi atIndex:i];
0 голосов
/ 05 марта 2019

У меня была уникальная ситуация с главным меню приложения, когда удаление и повторное добавление пунктов меню не убирало выделение пункта меню. Вот функция Swift, которую я использовал, чтобы убрать выделение, добавив фиктивный элемент меню, «щелкнув» по ​​нему, а затем удалив фиктивный элемент:

func unhighlightItems(in menu: NSMenu) {
    let dummyItem = NSMenuItem(title: "", action: nil, keyEquivalent: "")
    menu.addItem(dummyItem)
    menu.performActionForItem(at: mainMenu.index(of: dummyItem))
    menu.removeItem(dummyItem)
}
0 голосов
/ 18 июля 2011

Мое решение состояло в том, чтобы удалить и повторно добавить пункты меню после cancelTracking:

- (void)mouseUp:(NSEvent*)event {
  NSMenuItem *item = [self enclosingMenuItem];      
  NSMenu *menu = [item menu];      
  if (nil != menu) {
      NSInteger index = [menu indexOfItem:item];      
      [menu cancelTracking];        
      [menu performActionForItemAtIndex:index];

      // hack to reset highlighted menu item state
      NSArray *items = [menu itemArray];
      [menu removeAllItems];
      for (NSMenuItem *item in items) {
          [menu addItem:item];
      }
  }
}    
0 голосов
/ 01 июня 2011

Я исправил это, убрав метод mouseUp в моем пользовательском представлении, а затем добавив в него еще один «скрытый» NSView, который имеет следующий метод:

- (BOOL)acceptsFirstResponder {
  NSMenu *menu = [item menu];
  [menu cancelTracking];
  [menu performActionForItemAtIndex:[menu indexOfItem:item]];
  return YES;
}
...