单击后从 NSMenuItem 中删除突出显示?

Posted

技术标签:

【中文标题】单击后从 NSMenuItem 中删除突出显示?【英文标题】:Remove highlight from NSMenuItem after click? 【发布时间】:2011-09-04 10:10:51 【问题描述】:

我已向我的 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 状态。

有没有办法改变它,所以当我点击时,当我下次打开菜单时,突出显示的状态会被移除?

【问题讨论】:

【参考方案1】:

让我大吃一惊的是,我们必须这样做而不是简单的 NSMenuItem setHighlighted 或 NSMenu removeHighlights 或其他东西。这是一个看起来很像 MrWalker 的答案的 sn-p。它只是从菜单中删除您自己的菜单项并将其放回原处。

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

    int i = [menu indexOfItem:selfmi];
    [menu removeItemAtIndex:i];
    [menu insertItem:selfmi atIndex:i];

【讨论】:

【参考方案2】:

我通过删除自定义视图中的 mouseUp 方法来解决此问题,然后在其中添加另一个“隐藏”NSView,该方法具有以下方法:

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

【讨论】:

【参考方案3】:

我的解决方案是在 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];
      
  
    

【讨论】:

【参考方案4】:

我在应用程序的主菜单中遇到了一个独特的情况,删除和重新添加菜单项并没有删除菜单项的突出显示。这是我用来删除突出显示的 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)

【讨论】:

以上是关于单击后从 NSMenuItem 中删除突出显示?的主要内容,如果未能解决你的问题,请参考以下文章

鼠标单击后从屏幕上删除 pygame sprite [重复]

单击 JavaFX 突出显示 TextField 中的所有文本

CKEditor 5如何从任何小部件/模型/视图中获取单击,更新和删除的事件

在显示主机菜单时更新 NSMenuItem

具有自定义视图的 NSMenuItem 不接收鼠标事件

删除 ListView 中所有项目的 onClick 突出显示