【问题标题】:What is first responder?什么是第一响应者?
【发布时间】:2021-11-26 08:42:46
【问题描述】:

根据苹果的documentation

当您的应用收到事件时,UIKit 会自动指示该事件 事件到最合适的响应者对象,称为第一个 响应者。

相同的文档解释了如何确定第一响应者

UIView 的 hitTest:withEvent: 方法遍历视图层次, 寻找包含指定触摸的最深子视图, 它成为触摸事件的第一响应者。

我不明白的是为什么 UIResponder 有一个属性叫做isFirstResponder?以及为什么存在becomeFirstResponder第一响应者不应该由 UIKit 根据特定触摸事件的位置动态确定吗?

此外,canBecomeFirstResponderUIView 返回 NO,这显然是不正确的,因为视图确实处理触摸事件。

我认为可以解决这种混淆的唯一方法是,如果所有这些方法都只与抖动、远程控制和编辑菜单类型的事件相关。但是文档并不清楚。

【问题讨论】:

    标签: ios uikit first-responder uiresponder


    【解决方案1】:

    我不明白的是为什么 UIResponder 有一个属性叫做firstResponder

    没有。 UIResponder 没有名为 firstResponder 的公共属性。

    以及为什么存在becomeFirstResponder

    becomeFirstResponder 的主要用途是以编程方式选择哪个文本字段获取键盘事件。

    第一响应者不应该由 UIKit 根据特定触摸事件的位置动态确定吗?

    事件的种类比触摸事件多。例如,有键盘事件和运动事件。 UIKit 跟踪的第一响应者是针对非触摸事件的。在其他系统中,这个概念通常称为“焦点”或更具体地称为“键盘焦点”。但是(在 iOS 中)第一响应者可以是不响应键盘事件的视图。

    此外,canBecomeFirstResponderUIView 返回NO,这显然是不正确的,因为视图确实处理触摸事件。

    没关系,因为触摸事件并不是真正从第一响应者开始的。它们从-[UIView hitTest:withEvent:] 返回的视图开始。

    我认为可以解决这种混淆的唯一方法是,如果所有这些方法都只与抖动、远程控制和编辑菜单类型的事件相关。但是文档并不清楚。

    有更多种类的非触摸事件以第一响应者开始,但除此之外,您已经正确解决了它。

    【讨论】:

    • 我只是将答案添加到标题问题:第一响应者实际上只是响应者链中的第一个对象。
    • 我的意思是isFirstResponder 不是firstResponder。更新了原始问题。不过你的答案很清楚,谢谢!
    • @Caleb 这让我感到困惑。第一响应者是响应者链中的第一个对象,仅用于一些 种事件。对于触摸事件,链中的第一响应者不一定是 THE firstResponder
    【解决方案2】:

    这不是一个“快速回答”的话题——最好的办法是进行一些搜索并阅读几篇关于它的文章。

    但是,简单地说……

    .becomeFirstResponder() 通常用于激活文本字段,而无需用户在字段中点击。常见情况是有多个文本字段(填写界面的表单类型),您会根据输入自动“跳转”到下一个字段:

    myTextField.becomeFirstResponder()
    

    再一次,正如您在浏览文档时已经看到的那样,还有更多内容……但这里的答案太多了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多