什么是第一响应者?

What is first responder?

根据 Apple 的 documentation:

When your app receives an event, UIKit automatically directs that event to the most appropriate responder object, known as the first responder.

相同的文档解释了如何确定 急救人员

The hitTest:withEvent: method of UIView traverses the view hierarchy, looking for the deepest subview that contains the specified touch, which becomes the first responder for the touch event.

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

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

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

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

但是,简而言之...

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

myTextField.becomeFirstResponder()

同样,正如您在浏览文档时已经看到的那样,它的内容远不止这些……但这里的答案太多了。

What I don't understand is why there is a property of UIResponder called firstResponder?

没有。 UIResponder 没有名为 firstResponder.

的 public 属性

And why becomeFirstResponder exists.

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

Should not the first responder be determined dynamically by UIKit based on location of the specific touch event?

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

Additionally, canBecomeFirstResponder return NO for UIView, which is clearly incorrect since views do handle touch events.

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

返回的视图开始

The only way I can think that can resolve this confusion is if all these methods are relevant only to events of the type of shake, remote control and editing menu. But the documentation is not clear about it.

从第一响应者开始的非触摸事件种类较多,除此之外,你已经正确解决了。