cocoa - 如何让ViewController成为第一响应者?

标签 cocoa swift keydown appkit

我正在制作一个“LearnToTypeQuick”应用程序,因此我需要验证我的键盘按键,看看它们是否与我在 View 上打印的内容匹配。

我想在我的 ViewController 中使用 keyDown 事件,因此我需要 ViewController 成为第一响应者。

我的问题是:我该怎么做?

最佳答案

I would like to use the keyDown event in my ViewController and therefore i need the ViewController to become first responder.

您可能实际上并不需要它。响应者链的全部要点是,如果一个响应者不处理给定的消息,它会将消息传递给链中的下一个响应者,依此类推。因此,您真正需要的只是让您的 View Controller 位于响应者链中,并确保其前面的任何响应者不会处理您感兴趣的消息。

当然,另一种策略是将键处理代码移动到适当的 View 中,并让该 View 根据需要向委托(delegate)(可以是 View Controller )发送消息。这可以为您节省一些更新用户正在输入的 View 等方面的工作,并且可能更符合典型的应用程序设计。

此策略的一个非常简单的实现是让用户在普通的旧 NSTextView 中键入内容。许多打字程序向用户显示一些段落,并让用户将该段落键入某种文本编辑字段。您可以将 View Controller 设置为文本字段的委托(delegate)。 NSTextView 提供的委托(delegate)消息之一是 -textDidChange:,因此您可以在 View Controller 中实现它(以及采用 NSTextViewDelegate > View Controller 声明中的协议(protocol))。如果您随后将 View Controller 设置为 TextView 的委托(delegate),则每次 View 中的文本发生更改时, TextView 都会发送 -textDidChange: 消息。然后,您可以将 View 中的文本与模型文本进行比较,并突出显示任何不匹配的地方,以便用户可以看到他/她犯了错误。

如果您确实希望 View Controller 成为第一响应者,那么没有什么可以阻止您这样做。您可以重写 -acceptsFirstResponder 使其返回 YES,然后向您的 View Controller 发送 -becomeFirstResponder 消息。

您可以阅读有关 responder chain 的更多信息和 how key events are handledCocoa 事件处理指南中。

关于cocoa - 如何让ViewController成为第一响应者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29197751/

相关文章:

macos - Cocoa OSX 在拖动操作期间设置光标

javascript - div onclick 或 oncontext 在 cocoa 中的 webview 加载后仅工作一次

ios - 如何从URL获取查询参数?

ios - 在不更改状态栏颜色的情况下呈现 View Controller ,例如 UIAlertController

javascript - 如何在 keydown 上编码多个键? (javascript)

cocoa-touch - 为什么Apple使用分配而不是weak来存储委托(delegate)?

ios - 解码 base64String 值返回 nil

javascript - 在 contenteditable div 中使用箭头键移动插入符号时停止不需要的滚动

macos - 在cocoa中获取键盘输入

objective-c - cocoa 坐标和碳坐标之间的转换?