【问题标题】:Best place to intercept Cmd-Key in NSDocument based app在基于 NSDocument 的应用程序中拦截 Cmd-Key 的最佳位置
【发布时间】:2014-04-27 13:00:58
【问题描述】:

在基于 NSDocument 的应用程序中,拦截 CmdAnyKey 键事件的最合适位置是什么?

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

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

我搜索了NSDocumentNSAppDelegateNSWindowController,但找不到任何合适的机制来挂钩以便在窗口级别接收这些命令。

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

【问题讨论】:

  • 您是否尝试过查看 Cntl-Tab(注意:Cntl-Tab,而不是 Cmd-Tab)是否自动工作?它在 Safari 中切换选项卡。也许这是一个系统范围的快捷方式?另外,处理这种事情的普通NSResponder不应该是你使用的吗?
  • NSWindowController 实现NSResponder。 Firefox 是一个应用程序拦截命令的示例,它没有处理该特定热键的菜单项。这个问题更笼统。

标签: cocoa nsdocument nswindowcontroller nsevent nsresponder


【解决方案1】:

是的,如果您需要在响应者链上的所有内容都拒绝处理它之后获取键盘事件,则子类化 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 而不是子类化。不同之处在于它在调度事件之前处理(并且可以选择丢弃)事件。

【讨论】:

  • 我已经实现了事件监视器方法 - 工作起来轻而易举!干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多