看来我应该处理flagsChanged:,但它是NSResponder的方法,NSMenu不继承NSResponder?我在主窗口控制器中尝试了它,当我点击菜单之前按Option键时它可以工作.以下用例不起作用:单击菜单项(没有项目),按选项键 – 我的项目应该出现,释放选项键 – 项目应该消失.
我还尝试了NSEvent的addLocalMonitorForEventsMatchingMask:handler:和addGlobalMonitorForEventsMatchingMask:handler:for NSFlagsChangedMask但是当主菜单打开时按下选项键时,不会触发本地或全局处理程序.
我怎样才能做到这一点?
解决方法 将以下内容添加到applicationDIDFinishLaunching中.// Dynamically update QCServer menu when option key is pressedNSMenu *submenu = [[[NSApp mainMenu] itemWithTitle:@"QCServer"] submenu]; NSTimer *t = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(updateMenu:) userInfo:submenu repeats:YES];[[NSRunLoop currentRunLoop] addTimer:t forMode:NSEventTrackingRunLoopMode];
然后加
- (voID)updateMenu:(NSTimer *)t { static NSMenuItem *menuItem = nil; static BOol isShowing = YES; // Get global modifIEr key flag,[[NSApp currentEvent] modifIErFlags] doesn't update while menus are down CGEventRef event = CGEventCreate (NulL); CGEventFlags flags = CGEventGetFlags (event); BOol optionKeyIspressed = (flags & kCGEventFlagMaskAlternate) == kCGEventFlagMaskAlternate; CFRelease(event); NSMenu *menu = [t userInfo]; if (!menuItem) { // VIEw Batch Jobs... menuItem = [menu itemAtIndex:6]; [menuItem retain]; } if (!isShowing && optionKeyIspressed) { [menu insertItem:menuItem atIndex:6]; [menuItem setEnabled:YES]; isShowing = YES; } else if (isShowing && !optionKeyIspressed) { [menu removeItem:menuItem]; isShowing = NO; } NSLog(@"optionKeyIspressed %d",optionKeyIspressed);}
计时器仅在跟踪控件时触发,因此不会影响性能.
总结以上是内存溢出为你收集整理的cocoa – 按Option键,在应用程序的主菜单中隐藏/显示菜单项全部内容,希望文章能够帮你解决cocoa – 按Option键,在应用程序的主菜单中隐藏/显示菜单项所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)