我已将自定义视图添加到我的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 状态。
有没有办法改变它,所以当我点击时,当我下次打开菜单时,突出显示的状态会被删除?
答案 0 :(得分:2)
让我想到我们必须这样做,而不是简单的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];
答案 1 :(得分:0)
我通过在自定义视图中删除mouseUp方法,然后在其中添加另一个“隐藏”NSView来修复此问题,该方法具有以下方法:
- (BOOL)acceptsFirstResponder {
NSMenu *menu = [item menu];
[menu cancelTracking];
[menu performActionForItemAtIndex:[menu indexOfItem:item]];
return YES;
}
答案 2 :(得分: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];
}
}
}
答案 3 :(得分: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)
}