ios - 什么是第一响应者?
问题描述
根据苹果的文档:
当您的应用程序接收到一个事件时,UIKit 会自动将该事件定向到最合适的响应者对象,即第一响应者。
相同的文档解释了如何确定第一响应者:
UIView 的 hitTest:withEvent: 方法遍历视图层次结构,寻找包含指定触摸的最深子视图,成为触摸事件的第一响应者。
我不明白的是为什么 UIResponder 有一个属性叫做isFirstResponder
?以及为什么becomeFirstResponder
存在。UIKit不应该根据特定触摸事件的位置动态确定第一响应者吗?
此外,canBecomeFirstResponder
return NO
for UIView
,这显然是不正确的,因为视图确实处理触摸事件。
我认为可以解决这种混淆的唯一方法是,如果所有这些方法都只与抖动、远程控制和编辑菜单类型的事件相关。但是文档并不清楚。
解决方案
我不明白的是为什么 UIResponder 有一个属性叫做
firstResponder
?
没有。UIResponder
没有名为 的公共属性firstResponder
。
以及为什么
becomeFirstResponder
存在。
的主要用途becomeFirstResponder
是以编程方式选择哪个文本字段获取键盘事件。
UIKit不应该根据特定触摸事件的位置动态确定第一响应者吗?
事件的种类比触摸事件多。例如,有键盘事件和运动事件。UIKit 跟踪的第一响应者是针对非触摸事件的。在其他系统中,这个概念通常称为“焦点”或更具体地称为“键盘焦点”。但是(在 iOS 中)第一响应者可以是不响应键盘事件的视图。
此外,
canBecomeFirstResponder
returnNO
forUIView
,这显然是不正确的,因为视图确实处理触摸事件。
没关系,因为触摸事件并没有真正从第一响应者开始。它们从返回的视图开始-[UIView hitTest:withEvent:]
。
我认为可以解决这种混淆的唯一方法是,如果所有这些方法都只与抖动、远程控制和编辑菜单类型的事件相关。但是文档并不清楚。
有更多种类的以第一响应者开头的非触摸事件,但除此之外,您已经正确解决了它。
推荐阅读
- python - 使用 AIOfile 读取异步文件
- git - 来自远程分支的 git rebase 问题
- function - Dart Flutter:功能未执行
- security - 我在安装 libc6 时遇到问题:amd64 会破坏语言环境,并且不允许取消配置
- javascript - 收到数据后渲染 MathJax
- ios - 如何快速获取窗口大小(包括 iPad 分屏)
- javascript - 如何使用角色反应和自动删除用户反应进行角色检查
- python - 为什么我收到此 django 连接中止错误
- amazon-web-services - Website does not update - Even after Invalidation through AWS Website, CLI and changing metadata of S3 Bucket
- selenium-webdriver - Selenium Java - Chrome 83. 0 - Authentication required. Basic Authentication required. Unable to login