我想在应用程序的主菜单中添加一个很少使用的菜单项。我希望它默认隐藏,仅当用户按住 Option 键时才显示。我该怎么做呢?
看来我应该处理flagsChanged:
, 但它是NSResponder
的方法和NSMenu
不继承自NSResponder
?我在主窗口控制器中尝试过它,当我在单击菜单之前按 Option 键时它会起作用。以下用例不起作用:单击菜单项(没有项目),按选项键 - 我的项目应该出现,释放选项键 - 项目应该消失。
我也尝试过 NSEvent 的addLocalMonitorForEventsMatchingMask:handler:
and addGlobalMonitorForEventsMatchingMask:handler:
for NSFlagsChangedMask
但是,当主菜单打开时按下选项键时,本地或全局处理程序都不会被触发。
我怎样才能做到这一点?
构建菜单时包括可选项目并将其标记为隐藏。然后将类实例设置为菜单的委托,并在菜单打开时添加运行循环观察器以控制可选项目的隐藏状态。
@implementation AppController {
CFRunLoopObserverRef _menuObserver;
}
- (void)updateMenu {
BOOL hideOptionalMenuItems = ([NSEvent modifierFlags] & NSAlternateKeyMask) != NSAlternateKeyMask;
[self.optionalMenuItem setHidden:hideOptionalMenuItems];
}
- (void)menuWillOpen:(NSMenu *)menu {
[self updateMenu];
if (_menuObserver == NULL) {
_menuObserver = CFRunLoopObserverCreateWithHandler(NULL, kCFRunLoopBeforeWaiting, true, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
[self updateMenu];
});
CFRunLoopAddObserver(CFRunLoopGetCurrent(), _menuObserver, kCFRunLoopCommonModes);
}
}
- (void)menuDidClose:(NSMenu *)menu {
if (_menuObserver != NULL) {
CFRunLoopObserverInvalidate(_menuObserver);
CFRelease(_menuObserver);
_menuObserver = NULL;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)