Key word
- Event Handling
- Responder
- the Responder Chain
Responder
1.一个Responder是UIResponder Class的实例化
2.常见的UIResponder子类有UIView,UIViewController, UIApplication
3.中文解释: 响应者
简述
- 场景1: 在屏幕上点击按钮
App会接收到一个Event, 并自动将该Event会分配给最合适的响应者 (第一响应者 First Reponder),此时是UIButton,UIButton对该事件进行处理。 - 场景2:在屏幕上点击文本
App会接收到一个Event,首先会把这个Event分配给UILabel,但是UILabel并不处理Event事件,所以UILabel会将该Event分配给它的superView.以此延续,最终结果有两种
1.找到能处理该事件的对象,just do something
2.没有找到,该点击没有引起任何的效果
可以看到,在场景2中,会有一个Event的传导路线。这个就是Responder Chain (中文解释:响应者链)
Responder Chain
- UIKit本身有一套默认的规则 决定了每个Responder的next Responder,当前Responder无法响应Event时,直接将该Event丢给next Responder
如下图,当点击文本时
1.UILabel并不处理点击事件
2.UIKit会将该事件丢给UILabel的next Responder,此处为它
的superView
3.延着链路,一路传递
UIViewController -> UIWindow -> UIApplication
image.png
UIKit本身默认的规则为
1.UIView的next Responder是superView,当superView为nil时,则为该view所属的container(绝大多数情况为UIViewController或者极少情况下为UIWindow)
2.UIViewController的next Responder是UIWindow
3.UIWindow的next Responder是UIApplication
// 基本上2,3的规则是不会去改变的。另外 基于职责分配原则,通常也不会在UIWindow和UIApplication做事件处理
(需要特殊说明的是当UIViewController本身是一个containerController,会包含childViewController,childViewController并不会参与到响应者链中,只有childViewController.View才会)
待续
网友评论