Cocoa和XCode中的关键事件

时间:2013-04-07 14:34:28

标签: 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子类加入我的应用程序。我想,我真的错过了一个基本概念。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:7)

当人们说“在NSResponder的子类中”时,他们并不一定意味着你应该创建一个 new NSResponder子类。它们的意思是:按键由响应者处理。你的应用程序结构充满了响应者!因此,为了干预密钥处理过程,将那些中的一个子类化(这样你就可以在某个地方放置代码)。

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

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

(向下滚动到“Responder Chain”标题。)

放置此类代码的常见位置是窗口控制器。 NSWindowController是一个NSResponder子类。它在响应者链中很高,你可能已经有了一个类。

另一种选择是使用视图。 NSView是一个NSResponder子类,您的窗口充满了视图。将一个非常惰性的NSView放在窗口中的所有内容中,只是作为一个后备NSResponder来捕获链中出现的事件,这并不奇怪。