当用户的手指点击屏幕的时候,iOS操作系统通过触摸屏获取用户的点击行为,然后把这个点击信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,在这个程序中逐级寻找能够响应这个事件的所有对象,然后把这些对象放入一个链表,这个链表就是iOS的响应链。
有如下界面:
Paste_Image.pngController中的view 上面添加了绿色的view 绿色的view上面添加一个button
1.触摸的这个点坐标在view上吗?true,然后view加入响应链,继续遍历view的子页面greenView。
2.在greenView上吗?true,greenView加入响应链,继续遍历greenView的子视图button。
3.在button上吗?在,button加入响应链,button没有子页面,这个检测结束。
经过以上检测就形成了这样一个链:view -->greenView -->button。
添加button的点击事件,在button中重写
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event; 方法
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
UIResponder * next = [self nextResponder];
NSMutableString * prefix = @"*****".mutableCopy;
NSLog(@"%@", [self class]);
while (next != nil) {
NSLog(@"%@%@", prefix, [next class]);
[prefix appendString: @"*****"];
next = [next nextResponder];
}
}
打印如下:
Paste_Image.png
事件的传递是从上到下的,事件的响应是从下到上的。
响应链已经建立起来,那么下面就该响应用户刚才的那次点击了,首先找到第一响应者button,看他有没有处理这次点击事件,如果button不处理就通过响应链找到它的nextResponder-greenView,greenView如果也不处理就会一直向上寻找,如果最终找到响应链的最后一个响应者AppDelegate也不处理,就会丢弃这次点击事件
网友评论