gpt4 book ai didi

cocoa - NSMenuItem 自定义 View 不响应 keyEquivalent

转载 作者:行者123 更新时间:2023-12-03 16:21:45 33 4
gpt4 key购买 nike

我已将自定义 NSView 设置为 NSMenuItem 来执行我自己的绘图和渲染。然而,分配给 NSMenuItem 的“keyEquivalent”似乎没有响应。我知道绘图和 Action 处理需要自行处理,但无论我做什么,我似乎都无法捕获 keyEquivalent 请求。我尝试过对 NSApplication 的 sendEvent 进行子类化,但这不起作用,因为我的应用程序是一个 NSStatusBarItem (LSUIElement),并且来自 NSEventTrackingRunLoopMode 的事件(当菜单关闭时)不工作到达 NSApplication 的 sendEvent。

然后我尝试使用:

- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event target:(id *)target action:(SEL *)action

这也不起作用,因为即使我已将主菜单的委托(delegate)设置为 Controller ,也从未调用过它。

有人知道如何在使用自定义 View 时捕获 NSMenuItems 上的“keyEquivalent”事件吗?

谢谢!

最佳答案

我知道这是一篇旧帖子,您可能已经过去很久了,但我遇到了同样的问题,并且在尝试寻找解决方案时多次遇到您的帖子,所以我想我会分享对我有用的内容。

我能够通过子类化 NSApplication 并覆盖 sendEvent 来解决这个问题。您提到您尝试过此操作但没有成功,所以我不知道有什么区别,但我在拦截来自 NSStatusBarItem 中的 NSMenu 的事件时没有问题。我的 key 等价物都是整数,因此我验证 key ,找到适当的项目,然后显式调用 NSMenuItem 操作。

-(void)sendEvent:(NSEvent *)theEvent
{
if([theEvent type] == NSKeyUp){
NSInteger mod = ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask);

if(mod == NSCommandKeyMask) {
NSInteger keyEquiv = [[theEvent characters] isEqualToString:@"0"]
? 10
: [[theEvent characters] integerValue];
if(keyEquiv > 0) {
NSMenuItem *item = [[(MyAppDelegate *)[self delegate] myStatusMenu] itemAtIndex:(keyEquiv - 1)];
if([[item keyEquivalent] integerValue] == keyEquiv){
[[item target] performSelector:[item action] withObject:item];
}
}
}
}
[super sendEvent:theEvent];
}

关于cocoa - NSMenuItem 自定义 View 不响应 keyEquivalent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4928158/

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