gpt4 book ai didi

cocoa - 按 Option 键隐藏/显示应用程序主菜单中的菜单项

转载 作者:行者123 更新时间:2023-12-03 16:04:59 26 4
gpt4 key购买 nike

我想在应用程序的主菜单中添加一个很少使用的菜单项。我希望它默认隐藏,仅当用户按住 Option 键时才显示。我该怎么做?

看来我应该处理flagsChanged:,但它是NSResponder的方法,并且NSMenu不继承自NSResponder ?我在主窗口 Controller 中尝试过它,当我在单击菜单之前按 Option 键时它会起作用。以下用例不起作用:单击菜单项(没有项目),按选项键 - 我的项目应该出现,释放选项键 - 项目应该消失。

我还尝试过 NSEvent 的 addLocalMonitorForEventsMatchingMask:handler:addGlobalMonitorForEventsMatchingMask:handler: for NSFlagsChangedMask 但是当主菜单按下选项键时open 本地或全局处理程序都不会被触发。

我该怎么做?

最佳答案

构建菜单时包含可选项目并将其标记为隐藏。然后将类实例设置为菜单的委托(delegate),并在菜单打开时添加运行循环观察器以控制可选项目的隐藏状态。

@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;
}
}

关于cocoa - 按 Option 键隐藏/显示应用程序主菜单中的菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11208632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com