【iOS】—— 事件传递链和响应者链总结

事件传递链和响应者链总结

之前也学习过这个内容这次在复习的时候,就想着写一下总结:
初始事件传递链和响应者链

1. 事件传递链:

事件传递链:

将用户在应用程序中的进行交互的事件发送到视图层次中的适当对象。在这个事件的传递过程中,从根视图开始查找,并递归向下查找最合适的处理该事件的视图(第一响应者)。

传递流程:
  • 事件产生: 用户通过与设备交互生成事件,系统将事件传递给引用的UIApplication实例,以开始事件分发。
  • UIApplication事件分发: UIApplication实例将事件传递给当前的UIWindow对象,进一步查找适合的响应者。
  • UIWindow事件分发:当前UIWindow通过调用hitTest:withEvent:方法来遍历整个视图层次结构,找到合适的视图来响应工作。
  • 命中测试(hitTest:withEvent:)
    **hitTest:withEvent:是寻找第一响应者的核心方法。**它通过以下步骤工作:
    1. 检查当前视图的属性隐藏hidden = NO,交互userInteractionEnabled=YES、透明度alpha>0.01三者都满足才能拥有响应的能力。
    2. 调用pointInside:withEvent:,确定触摸点是否在当前视图的边界范围内。
    3. 从后往前遍历子视图,递归调用子视图的hitTest:withEvent:方法。
    4. 直到找到合适的子视图,返回子视图作为第一响应者,否则返回当前视图本身。
  • 第一响应者确定 :如果确定了当前触摸点在当前视图上,同时当前视图没有任何子视图,那么当前视图就成为第一响应者并开始处理触摸事件。

相应的大致流程过程:UIKit --> active app's event queue --> window --> root view --> ...... --> lowest view
事件传递的本质就是为了让我们找到第一响应者。

总结第一响应者:
  1. 能够响应触摸事件
  2. 触摸点在自己的边界范围内
  3. 没有任何子视图或者所有子视图都不在触摸点上。

2. 响应者链

响应者链

在事件传递链中找到了第一响应者,但是第一响应者不一定可以响应事件,因为他可能没有实现触摸事件。

传递流程

对于响应者链的传递流程可以通过下面这张图来看:

左边的app响应者链:

  1. 初始视图对象尝试对事件进行处理,如果无法处理,就将事件传递给父视图对象。在视图树,初始视图并不是最顶端的视图。
  2. 父视图也会进行同样的尝试,因为相同的原因,只能将事件继续向上传递。
  3. 视图控制器中最顶层的视图也进行相同的尝试,结果处理不了就会传递给视图控制器。
  4. 视图控制器也一样无法处理,于是继续向上传递给主窗体对象(window)。
  5. 主窗体也无法处理,就会继续传给app的单例实体对象。
  6. 最后单例实体对象没有处理,就会将事件丢弃掉。

右边的app响应者链:

  1. 视图将事件沿着视图控制器的视图树向上传递,直到最顶端的视图。
  2. 顶端的视图无法处理就直接交给视图控制器。
  3. 视图控制器无法处理就将事件传递给其顶端视图所在的父视图,重复1~3,知道到达最顶端的跟视图控制器。
  4. 跟视图控制器将事件传递给主窗体对象。
  5. 主窗体对象传递给app的单例实体对象。
总结响应者链流程

判断当前视图能否响应,再去判断当前视图的nextResponder,如果是VCView,那么nextResponer就是VC

如果不是控制器的View,上一个响应者就是SuperView

相应的大致流程过程:第一响应者->super view->......->ViewController->window->application

总结:

  • 触摸事件发生之后,系统会生成简单的UIEvent
  • UIEvent产生的事件添加到UIApplication队列中。
  • 然后UIApplication将事件分发给UIWindow,主窗口会在视图层次中找到合适的视图处理触摸事件。
  • 不但递归调用hitTest方法来确定第一响应者。
  • 如果第一响应者无法响应事件,就按照响应者链往上传递,传递给父视图。
  • 一直传到UIApplication,如果都没有响应则事件丢弃。
相关推荐
liyoro15 小时前
用 Codex + 提示词生成一个快速打开 Ghostty 的 macOS 小工具
macos·shell·ai编程
2601_9588151618 小时前
面向视疲劳缓解的手机贴膜光学系统设计:scinique®双护协同技术的工程实现
ios·智能手机·iphone·圆偏振光护眼·磁控溅射ar抗反射·iphone护眼膜
A懿轩A19 小时前
Claude Code 2026 最新版下载安装教程详细版 涵盖Windows 和 MacOS 安装 附常见问题解决方案
windows·macos
倔强的石头10620 小时前
SenseNova-U1 实战体验:从网页版生成,到 Mac 踩坑,再到 CUDA 服务器跑通本地部署
运维·服务器·macos
吠品20 小时前
Go赋能:HTTP大文件秒传与断点续接
ios·iphone·xcode
唐诺1 天前
【无标题】
ios·属性包装器·wrappers
测试员周周2 天前
【Appium 系列】第14节-断言与验证 — Validator 的设计
android·人工智能·python·功能测试·ios·单元测试·appium
zandy10112 天前
2026 主流技术栈:hermes agent多环境安装配置:Windows/Mac/Linux
linux·windows·macos
2501_916008892 天前
Mac 上生成 AppStoreInfo.plist 文件,App Store 上架
android·macos·ios·小程序·uni-app·iphone·webview