按下键盘事件(keyDown event)最佳响应做法

4
我正在编写我的第一个Cocoa应用程序。这是一个简单的实用程序——计算器。我已经让所有东西都能正常工作了,最后我想要添加的是使应用程序响应按键事件。因此,您可以使用鼠标点击“4”按钮,或者只需按下键盘上的“4”键。我正在阅读所有事件处理文档,但我没有找到推荐处理NSResponder(或NSView)的方法。
我可以创建一个NSWindow子类,并告诉接口构建器将主窗口设置为该类型。然后,当我在我的新NSWindow子类中覆盖keyDown消息时,它会获取事件,但我不确定如何将其连接到我的应用程序委托类(因为我基本上只想根据按下的键切换并调用委托中相应的消息,就像按钮“select”操作的目标一样)。
或者,我听说过通过将应用程序委托类的超类从NSObject更改为NSView或NSResponder之类来完成此操作。我还没有深入探究这个想法,但我不确定如何实际获取应用程序委托对象,然后将其设置为第一响应者(我认为那是我想要做的)。
因此,我希望有人能给我具体的方向,告诉我应该在哪里实现我的keyDown方法,但我也想了解推荐的“最佳实践”是什么。苹果公司会说做这件事情的正确架构是什么?我对学习如何使其工作和背后的苹果设计模式同样感兴趣。
我的程序结构如下: 我有一个nib文件(实际上是.xib),在其中设计了一个用于显示的文本框和一组按钮。我已经在那里注册了出口和操作到AppDelegate类(标准项目模板为您设置的类)。遵循MVC模式,然后我有一个Calculator类,AppDelegate初始化它并且计算器的所有实际逻辑都在该类中。AppDelegate基本上只是响应来自按钮的消息,将它们传递给Calculator类中的方法,然后询问Calculator当前的显示值并将其更新回文本框中。因此,我的nib文件中的图形元素是“视图”,AppDelegate是“控制器”,而Calculator类是“模型”。对吗?
那么谁应该处理keyDown事件?似乎视图应该捕获它们并将它们发送给控制器,但我该如何设置它?
我想可能相关的问题是,我看到了“窗口控制器”和“视图控制器”类的提及。我不确定这些类的目的是什么。我的简单应用程序是否拥有它们?它应该吗?
1个回答

3

使用NSButtonsetKeyEquivalent:方法或在界面构建器中为每个按钮设置密钥等效。

我不确定正确的做法是什么,但自定义键事件处理可以放在自定义窗口contentView中,如下所示:

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

    //Put event handling code here.

    [super keyDown:theEvent];
}

- (BOOL)acceptsFirstResponder {
    return YES;
}

如果有人知道正确的方法,请随时参与讨论。

谢谢,这听起来像是我特定问题的最佳答案。我仍然很好奇关于覆盖keyDown方法的正确设计模式的更一般性问题的答案是什么。 - Daniel Skarbek
这几乎适用于所有按钮。我正在制作一个“程序员计算器”,因此我的一些按钮是两个字符的运算符,例如“<<”。所以,我打算自定义我的keyDown方法来检测连续的两个字符。我还想通过将粘贴的所有字符输入为计算器命令来响应粘贴,以便您可以复制和粘贴表达式以进行计算 - 但我想处理复制和粘贴是完全不同的问题。 - Daniel Skarbek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接