我通过为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子类。他们的意思是:按键是由响应者处理的。你的应用结构中充满了响应器!因此,要干预键处理过程,可以对中的一个进行子类化(以便有地方放置代码)。
您缺少的"基本概念"是响应链:
https://developer.apple.com/library/mac/文档/可可/概念/EventOverview/EventArchitecture EventArchitecture.html
(向下滚动到标题"Responder Chain")
窗口控制器是放置这类代码的常见地方。NSWindowController是NSResponder的子类。它在应答器链的顶端,你可能已经有了它的类。
另一个选择是使用视图。NSView是NSResponder的子类,你的窗口充满了视图。把一个不活跃的NSView放在窗口中所有东西的后面并不奇怪,只是作为一个backstop NSResponder来捕捉链上出现的事件。