几乎所有NSStatusItem
都已被10.10弃用,底层NSStatusBarButton
的行为似乎令人困惑。
目前,我正在开发一个菜单栏应用程序。当用户点击该应用程序的菜单栏图标时,我的应用程序委托中的一个方法会通过目标操作调用,显示带有一些信息的NSPopover(如果它已经可见,则关闭它)。
通常,如果您将NSMenu与NSStatusItem关联起来,当用户单击菜单栏图标时,该图标保持突出显示状态,直到菜单关闭。类似地,单击系统音量图标会弹出滑块,并使其图标保持突出显示状态,直到包含滑块的视图消失。
但是,由于我打开了NSPopover,因此系统会在鼠标按下时突出显示该图标,然后在调用我的方法后在鼠标抬起时返回正常状态。这意味着在该循环中似乎没有什么我可以做来维护突出显示状态。我希望该图标在鼠标抬起时继续保持突出显示状态,只有在我告诉它要关闭我的popover时才返回正常状态。
我不知道该如何做到这一点。我尝试过使用
[self.statusItem.button setHighlighted: YES];
//or [self.statusItem.button highlight: YES];
当我在应用委托中接收到鼠标弹起事件并打开弹出窗口时,问题是系统仍然将该帧/循环从先前的鼠标按下处于高亮状态,而在我将其设置为高亮状态后,由于鼠标弹起,它立即将其设置为非高亮状态。我可以通过封装此内容在一个方法中,稍后使用定时器或延迟选择器运行该方法来解决这个问题。这使我可以保持图标高亮状态,但是会出现闪烁;当鼠标按下时,图标会自动高亮,当鼠标松开时,它会在一帧中取消高亮,然后我的方法重新将其高亮。
我还想到,也许我可以使用已弃用的
setHighlightMode:
并将其设置为NO
,以防止图标在单击时自动高亮,然后使用setHighlighted:/highlighted:
手动设置它,但这也不起作用。同样,我认为这也可能起作用: NSButtonCell* cell = (NSButtonCell*)self.statusItem.button.cell;
cell.highlightsBy = NSNoCellMask;
但是,无论如何,单击它都会自动突出显示图标,并在鼠标抬起后取消高亮显示,我的方法被调用。基本上来说:
1.不希望的
NSStatusBarButton
自动高亮行为干扰了手动设置高亮状态,除非我延迟手动设置,这会引入短暂的闪烁。2.唯一似乎成功禁用此自动行为的是已弃用的
setHighlightMode:
,但这似乎阻止了所有高亮,无论是手动还是自动。3.唯一的解决方法似乎是向NSButtonCell添加子视图,添加鼠标抬起事件侦听器,然后根据此处设置父视图的高亮状态:NSStatusBarButton keep highlighted,但我认为应该有一种更简单的方法来完全禁用自动突出显示。
总之:有没有一种简单的方法让我完全控制我的菜单栏图标何时何时不高亮,以便在显示NSPopover时可以自然突出显示它?
-popUpStatusItemMenu:
。3)运行内部消息循环([NSApp nextEventMatchingMask:...]
和[NSApp sendEvent:...]
),以防止您的点击处理程序在弹出窗口关闭之前返回。 - Ken Thomases