3

我正在通过为 OSX 构建一个基本的计算器应用程序来学习 Objective-C。一切都很好,除了我需要允许按下键盘上的某些键来做同样的事情,就像你点击界面上的按钮一样。

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

响应者.h


#import <Foundation/Foundation.h>

@interface Responder : NSResponder

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

@end

响应者.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 子类放入我的应用程序中。我认为我真的错过了一个基本概念。任何帮助表示赞赏!

4

1 回答 1

8

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

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

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

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

放置此类代码的常见位置是窗口控制器。NSWindowController 是一个 NSResponder 子类。它在响应者链中处于较高位置,您可能已经为它上了一堂课。

另一种选择是使用视图。NSView 是一个 NSResponder 子类,您的窗口充满了视图。将原本惰性的 NSView 放在窗口中所有内容的后面也就不足为奇了,只是为了充当支持 NSResponder 以捕获链上出现的事件。

于 2013-04-07T14:45:49.223 回答