objective-c - Cocoa 和 XCode 中的关键事件

标签 objective-c cocoa events nsresponder

我正在通过为 OSX 构建一个基本的计算器应用程序来学习 Objective-C。一切都工作得很好,除了我需要允许按下键盘上的某些键来执行与单击界面上的按钮相同的操作。

我读到的所有内容都说要捕获这些,您必须在 NSResponder 的子类中拥有逻辑。我的问题在于如何“连接”该文件。创建一个新的 .h 和 .m 文件,对 NSResponder 进行子类化,如下所示:

Responder.h

<小时/>
#import <Foundation/Foundation.h>

@interface Responder : NSResponder

   - (void)keyDown:(NSEvent *)event;

@end

Responder.m

<小时/>
#import "Responder.h"

@implementation Responder

- (void)keyDown:(NSEvent *)event {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert addButtonWithTitle:@"OK"];
    [alert setMessageText:@"Hey"];
    [alert setInformativeText:@"You Pressed A Key!"];
    [alert setAlertStyle:NSWarningAlertStyle];
    [alert runModal];
}

@end

应用程序如何知道使用该文件?在 .xib 文件的界面中是否有某个位置可以拖动蓝色箭头并将其“连接”到某个位置?我做得对吗?我已经在谷歌上搜索了一段时间,一切都假设我知道如何将 NSResponder 子类添加到我的应用程序中。我认为我在这里真的缺少一个基本概念。如有任何帮助,我们将不胜感激!

最佳答案

当人们说“在 NSResponder 的子类中”时,他们并不一定意味着您应该创建一个新的 NSResponder 子类。他们的意思是:按键由响应者处理。您的应用程序结构充满了响应者!因此,要干预 key 处理过程,请对其中一个进行子类化(以便您有地方放置代码)。

您缺少的“基本概念”是响应者链:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html

(向下滚动到标题“响应程序链”。)

经常放置此类代码的地方是窗口 Controller 。 NSWindowController 是 NSResponder 的子类。它位于响应者链的较高位置,您可能已经为它准备了一个类。

另一个选择是使用 View 。 NSView 是 NSResponder 的子类,你的窗口充满了 View 。将一个原本惰性的 NSView 放在窗口中所有内容的后面,只是作为一个后备 NSResponder 来捕获链上的事件,这并不奇怪。

关于objective-c - Cocoa 和 XCode 中的关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863537/

相关文章:

iOS Dismiss 和 Present View Controller 自定义动画

ios - 使用数组 objective-c /iOS

objective-c - 使用Obj-C,Xcode和libxml2的简单libxml2 XML解析示例?

c++ - 将 self 从 Objective C 传递到 C++,不再重新分配

objective-c - 如何使用自定义 URL 方案将 Get URL 事件发送到正在运行的应用程序?

angular - 它相当于 Blazor 中的 Angular/Vue 事件发射吗?

java - 绑定(bind)数据触发更改后 Swing/JTable 不更新

python - 从 python 到 Objective C 的套接字代码

objective-c - 将 SVG 命令转换为 CoreGraphics

jquery - 多个事件监听器?