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

标签 cocoa nsdocument nswindowcontroller nsevent nsresponder

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

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

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

我搜索了 NSDocumentNSAppDelegateNSWindowController,但找不到任何适当的机制来 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/

相关文章:

iphone - UITextField 通过 Interface Builder 更改字体大小

ios - 如果我没有进行更改,为什么我需要同步 NSUserDefaults?

cocoa - 打开时将所有 NSDocument 窗口置于前面

swift - 如果我在 NSDocument 中取消保存操作,则无法退出应用程序

macos - 如何在文件 > 新建/Cmd+N 上显示应用程序模式 "New Document"窗口?

macos - (Mac) 将 NSWindowController 的窗口更改为 NSWindow 的子类

macos - 如何在 NSOpenPanel 对话框中将文件设置为 "preselect"

objective-c - @"Strings"在内存中是如何分配的?

embedded-resource - cocoapods:资源没有复制到mainBundle

objective-c - 如何为 NSDocument 实现自定义 NSWindowController