我正在通过为OSX构建基本的计算器应用程序来学习Objective-C。一切正常,除了我需要允许按下键盘上的某些键以执行与单击界面上的按钮相同的操作外。
我读过的每一句话都说要捕获这些,您必须在NSResponder的子类中拥有逻辑。我的问题在于如何“连接”该文件。创建一个新的.h和.m文件,该文件将NSResponder子类化,如下所示:
响应者
#import <Foundation/Foundation.h>
@interface Responder : NSResponder
- (void)keyDown:(NSEvent *)event;
@end
响应者
#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子类。他们的意思是:按键由响应者处理。您的应用程序结构充满了响应者!因此,要干预密钥处理过程,请子类化其中一个(以便您可以在某处放置代码)。
您缺少的“基本概念”是响应者链:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html
(向下滚动到标题“ Responder Chain”。)
放置此类代码的常见位置是窗口控制器。 NSWindowController是NSResponder的子类。它在响应者链中处于较高的位置,您可能已经为它准备了一个课程。
另一种选择是使用视图。 NSView是NSResponder的子类,并且您的窗口充满了视图。在窗口中的所有内容后面都放置一个惰性的NSView,只是充当后台NSResponder来捕获链中即将发生的事件,这并不奇怪。