Jer*_*ris 2 events cocoa objective-c nsresponder
我正在通过为OSX构建一个基本的计算器应用程序来学习Objective-C.一切都很美妙,除了我需要按下键盘上的某些键来做同样的事情,就像你点击界面上的按钮一样.
我读到的所有东西都说要捕获这些,你必须在NSResponder的子类中拥有逻辑.我的问题在于如何"连接"该文件.创建一个新的.h和.m文件,它是NSResponder的子类,如下所示:
Responder.h
#import <Foundation/Foundation.h>
@interface Responder : NSResponder
- (void)keyDown:(NSEvent *)event;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
应用程序如何知道使用该文件?是否在.xib文件的界面中的某处,我拖动那个蓝色箭头并将其"连接"到某个地方?我甚至做得对吗?我已经谷歌搜索了一段时间,一切都假设我知道如何将NSResponder子类加入我的应用程序.我想,我真的错过了一个基本概念.任何帮助表示赞赏!
当人们说"在NSResponder的子类中"时,它们并不一定意味着你应该创建一个新的 NSResponder子类.它们的意思是:按键由响应者处理.你的应用程序结构充满了响应者!因此,在关键处理过程进行干预,子类之一的(让你有地方把代码).
你缺少的"基本概念"是响应者链:
(向下滚动到标题"Responder Chain".)
放置这种代码的常见地方是窗口控制器.NSWindowController是一个NSResponder子类.它在响应者链中很高,你可能已经有了一个类.
另一种选择是使用视图.NSView是一个NSResponder子类,您的窗口充满了视图.将一个非常惰性的NSView放在窗口中的所有内容中,只是为了捕获链中出现的事件的后备NSResponder,这并不奇怪.