单击后从 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 中的所有文本