首页 > 解决方案 > 什么是第一响应者?

问题描述

根据苹果的文档

当您的应用程序接收到一个事件时,UIKit 会自动将该事件定向到最合适的响应者对象,即第一响应者。

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

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

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

此外,canBecomeFirstResponderreturn NOfor UIView,这显然是不正确的,因为视图确实处理触摸事件。

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

标签: iosuikitfirst-responderuiresponder

解决方案


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

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

以及为什么becomeFirstResponder存在。

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

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

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

此外,canBecomeFirstResponderreturn NOfor UIView,这显然是不正确的,因为视图确实处理触摸事件。

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

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

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


推荐阅读