在基于 NSDocument
的应用程序中拦截 CmdAnyKey 键事件的最合适位置是什么?
目的是切换到事件窗口中的某个组件 - 有点像 Firefox 允许您切换选项卡 - 无需在菜单命令上有匹配的快捷方式来执行该任务。
即理想情况下,框架应该进行正常处理,包括处理菜单命令,并且在所有其他响应程序无法响应该特定快捷方式之后,它应该被路由到自定义方法。
我搜索了 NSDocument
、NSAppDelegate
、NSWindowController
,但找不到任何适当的机制来 Hook 以接收这些命令在窗口级别。
因此,缺乏任何现有的自定义机制,在自定义 NSWindowController
中重写 keyDown:
看起来是实现所需效果的最合适方法吗?
最佳答案
是的,如果您需要在响应者链上的所有内容都拒绝处理键盘事件后获取键盘事件,则可以通过子类化 NSWindow 来实现此目的。
以下是我在一个项目中的做法:
- (void)keyDown:(NSEvent*)event
{
SEL keyDownBool = @selector(keyDownBool:);
if ([[self delegate] respondsToSelector:keyDownBool]
&& [[self delegate] performSelector:keyDownBool withObject:event])
{
return;
}
[super keyDown:event];
}
我的定制keyDownBool:
如果委托(delegate)方法处理特定的按键事件,则返回 YES。否则此方法将按键事件向下传递到 super
.
现在我正在使用+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent* (^)(NSEvent*))block
而不是子类化。不同之处在于,它在事件被分派(dispatch)之前处理(并且可以选择丢弃)事件。
关于cocoa - 在基于 NSDocument 的应用程序中拦截 Cmd-Key 的最佳位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23323757/