4

我正在编写我的第一个 Cocoa 应用程序。这是一个简单的实用程序——一个计算器。我已经完成了所有工作,我最不想添加的是我希望应用程序响应按键事件。因此,您可以用鼠标单击“4”按钮,也可以直接按键盘上的“4”键。我正在阅读所有的事件处理文档,但我没有采用推荐的方法来获取处理事件的 NSResponder(或 NSView)。

我可以创建一个 NSWindow 的子类并告诉界面构建器创建该类型的主窗口。然后,当我在我的新 NSWindow 子类中覆盖 keyDown 消息时,它会获取事件,但我不确定如何将它连接到我的应用程序委托类(因为我基本上只想打开按下的键并调用相应的消息在按钮“选择”操作目标的委托中。

或者,我想我听说过通过将应用程序委托类的超类从 NSObject 更改为 NSView 或 NSResponder 或其他东西来做到这一点。我并没有过多地探讨这个想法,但我不确定如何实际获取应用程序委托对象,然后实际设置为第一响应者(我认为这就是我想要做的)。

所以,我希望有人能给我关于如何/在哪里实现我的 keyDown 方法的具体指导,但我也想了解推荐的“最佳实践”是什么。苹果会说什么是做这件事的正确架构?我对学习如何使这项工作像学习其背后的 Apple 设计模式一样感兴趣。

我的程序结构如下:我有一个 nib 文件(实际上是一个 .xib),我在其中设计了一个带有用于显示的文本框和几个按钮的窗口。我已经将出口和操作从那里注册到 AppDelegate 类(标准项目模板为您设置的类)。遵循 MVC 模式,然后我有一个 AppDelegate 初始化的 Calculator 类,并且计算器的所有实际逻辑都在该类中。AppDelegate 基本上只是响应来自按钮的消息,将它们传递给 Calculator 类中的方法,然后向 Calculator 询问当前显示值并将其更新回文本框。因此,我的 nib 文件中的图形元素是“视图”,AppDelegate 是“控制器”,Calculator 类是“模型”。正确的?

那么,谁应该处理 keyDown 事件呢?似乎视图应该捕获它们并将它们发送到控制器,但是我该如何设置呢?

我想一个可能相关的问题是我已经看到提到“窗口控制器”和“视图控制器”类。我不确定我是否理解这些课程的意义。我的简单应用程序有吗?应该是?

4

1 回答 1

3

Use NSButton's setKeyEquivalent: method or set the key equivalent for each button in interface builder.

I'm not sure of the "proper" way to do this, but custom key event handling can be put in a custom window contentView like so:

- (void)keyDown:(NSEvent *)theEvent {
    NSLog(@"keyDown:%@", theEvent);

    //Put event handling code here.

    [super keyDown:theEvent];
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

If anyone knows the correct way of doing this, feel free to chime in.

于 2012-06-11T00:48:15.560 回答