在基于NSDocument的应用程序中拦截Cmd-Key的最佳位置

时间:2014-04-27 13:00:59

标签: cocoa nsdocument nswindowcontroller nsevent nsresponder

在基于NSDocument的应用程序中拦截 Cmd AnyKey 键事件最合适的地方是什么?

意图是切换到活动窗口中的某个组件 - 有点像Firefox允许您切换选项卡 - 没有菜单命令上的匹配快捷方式来执行该任务。

即。理想情况下,框架应该进行正常处理,包括处理菜单命令,并且在所有其他响应者无法响应该特定快捷方式后,应将其路由到自定义方法。

我已搜索NSDocumentNSAppDelegateNSWindowController但无法找到任何适当的机制进行挂钩,以便在窗口级别接收这些命令。< / p>

因此,缺少任何现有的自定义机制会在自定义keyDown:中覆盖NSWindowController,看起来是达到预期效果的最合适方式吗?

1 个答案:

答案 0 :(得分:2)

是的,如果你需要在响应者链上的所有内容都拒绝处理它之后获取键盘事件,那么继承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:委托方法返回YES。否则,此方法将键事件传递给super

现在我使用+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent* (^)(NSEvent*))block而不是子类化。区别在于它在调度之前处理(并可选地丢弃)事件。