iOS 中第一响应者的正式定义是啥?

Posted

技术标签:

【中文标题】iOS 中第一响应者的正式定义是啥?【英文标题】:What is a formal definition of a first responder in iOS?iOS 中第一响应者的正式定义是什么? 【发布时间】:2014-12-15 17:20:53 【问题描述】:

我知道第一响应者对象是根据输入活动等接收回调信号,并且它将在链上冒泡,直到可以找到愿意处理它的响应者。

但更正式地说,第一响应者的范围是什么?例如,它是应用程序范围的响应器吗?似乎成为第一响应者只是说这个特定对象将接收交互通知。另一个响应者可以窃取第一响应者的状态吗?

请解释或指导我了解一些相关信息。我已经阅读了 Apple 对响应者的一般解释。我正在寻找一个更详细的解释。

【问题讨论】:

【参考方案1】:

ios 中第一响应者的范围由视图层次结构决定。请记住,响应者是响应者层次结构的一部分,由 Apple 文档定义:

响应者是一个可以响应事件并处理它们的对象。所有响应者对象都是最终从 UIResponder (iOS) 或 NSResponder (OS X) 继承的类的实例。

实际上,所有响应者都是潜在响应者链的一部分,一直延伸到应用程序本身。这意味着响应者的范围取决于您必须走多远才能获得能够处理响应的对象。如果第一响应者是 UI 元素,例如 UITextField,则您的范围与该响应者的范围相关联。

在此图中,iOS 第一响应者层次结构显示在左侧(OS X 在右侧):

要回答问题的第二部分,是的,如果用户与元素交互,对象可以“窃取”第一响应者的状态,例如:

    用户单击 textField1。它现在是第一响应者。 用户单击 textField2。它已经从 textField1 接管了第一响应者的状态。

...您可以通过某些功能赋予他们第一响应者身份:

[textField3 becomeFirstResponder]; //This is now the first responder
[textField4 becomeFirstResponder]; //Now textField4 has 'stolen' first responder status
[textField4 resignFirstResponder]; //The text field has resigned its first responder status to the next level up

对于阅读本文但尚未查阅 Apple 文档的其他人,一个很好的起点是此处的响应者层次结构说明: https://developer.apple.com/library/ios/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html

我希望这会有所帮助!

【讨论】:

感谢您的回答。为了进一步澄清,当一个元素退出第一响应者状态时,这是否意味着之前成为第一响应者的最后一个元素再次成为第一响应者? 它没有。当您调用resignFirstResponder 时,仅表示当前没有指定响应者。您没有任何时候都有第一响应者。 @RuChernChong "onFocus" 对于刚开始使用 iOS 的 android 开发者(即我)很有意义【参考方案2】:

它是窗口的属性。该窗口始终只有一个第一响应者。任何 UIResponder 都可以通过发送 becomeFirstResponder 来声明第一响应者状态,这就是为什么您可以通过向 UITextField 发送该消息来获得“焦点”。

【讨论】:

这正是我正在寻找的答案。因此,例如,如果另一个组件成为第一响应者,它会为自己窃取焦点? 正确,如果它成功成为第一响应者。 (它可以尝试成为第一响应者并失败。)可能只有一个。 阅读本书的这一部分可能会对您有所帮助:apeth.com/iOSBook/ch11.html#_the_responder_chain 这也是为什么警报视图可以在不干扰当前第一响应者的情况下窃取焦点的原因。 UIAlertView 完全在另一个 UIWindow 中。【参考方案3】:

在窗口对象之前请记住一个在处理之前。

当应用程序对象获得触摸对象或其他转换为它的事件对象并将其分派给窗口对象时。并且窗口对象发送到最合适的对象来处理事件(响应者链)。所以 window 实例不再有属性 first responder 实例了。

weak var firstResponder: NSResponder?  get 

【讨论】:

以上是关于iOS 中第一响应者的正式定义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - UIButton 成为打开键盘的第一响应者

自定义 inputaccessoryView 中的 UITextView 不退出第一响应者状态

将 API 响应返回到 web/Android/iOS 时最好的方法是啥?

Cocoa 在多个窗口中验证菜单项

使用 iOS 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是啥?

后台应用程序的响应者链是啥样的?