消息响应链

当用户点击了屏幕中的button,事件是如何响应的呢,为什么点击其他区域没有事件响应呢?事件又是怎么触发的呢?


消息响应链_第1张图片
屏幕快照 2017-05-04 下午3.58.28.png

首先当用户点击button后,操作系统监听到用户点击了某点的位置,将该消息传递给当前APP的运行循环

在程序内部的流程图大概如下


消息响应链_第2张图片
运行循环 .png

1.当前的运行循环监听到屏幕上有一点被触摸,运行循环将该消息传递给UIApplication,查找触摸对象
2.UIApplication将消息传递给UIWindow,查找触摸对象
3.UIWindow将消息传递给根控制器
4.根控制器将消息传递给self.view
5.self.view会查找所有的子视图,判断触摸的点在哪个子控件内,然后将消息传递给子控件
6.子控件查找该触摸点在哪个控件内,查找到button后,button,button之下没有了子控件,那么该button就是第一事件响应者,触摸的对象就是button
7.button调用touchBegin方法,将消息发送给子控件,
子控件在调用touchBegin方法,将消息发送给self.view
以此类推一直传递到运行循环
8.运行循环就知道,点击用户点击的是button按钮,就会去查找button是否注册了事件,注册了就会调用该事件,没有注册,该消息会被丢弃。

事件传递设计的方法
1.从上到下查找对象用 hitTest方法
2.事件响应,用touchXXX方法

你可能感兴趣的:(消息响应链)