4

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

4 に答える 4

3

単純なNSMenuItemsetHighlightedやNSMenuremoveHighlightsなどの代わりに、これを実行する必要があることに気づきました。これは、MrWalkerの回答によく似たスニペットです。メニューから独自のメニュー項目を削除して、元に戻すだけです。

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

    int i = [menu indexOfItem:selfmi];
    [menu removeItemAtIndex:i];
    [menu insertItem:selfmi atIndex:i];
于 2011-09-13T00:03:30.810 に答える
0

カスタムビューでmouseUpメソッドを削除し、その中に次のメソッドを持つ別の「非表示」NSViewを追加することで、これを修正しました。

- (BOOL)acceptsFirstResponder {
  NSMenu *menu = [item menu];
  [menu cancelTracking];
  [menu performActionForItemAtIndex:[menu indexOfItem:item]];
  return YES;
}
于 2011-06-01T17:21:01.173 に答える
0

私の解決策は、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];
      }
  }
}    
于 2011-07-18T16:55:17.667 に答える
0

アプリケーションのメインメニューには、メニュー項目を削除して再度追加してもメニュー項目のハイライトが削除されないという独特の状況がありました。ダミーのメニュー項目を追加し、それを「クリック」してからダミーの項目を削除することでハイライトを削除するために使用した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)
}
于 2019-03-05T19:16:25.607 に答える