【问题标题】:Remove highlight from NSMenuItem after click?单击后从 NSMenuItem 中删除突出显示?
【发布时间】: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 状态。

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

【问题讨论】:

    标签: objective-c nsmenuitem nsmenu nsstatusitem


    【解决方案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)
          }
          

          【讨论】:

            猜你喜欢
            • 2020-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-15
            • 2013-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多