这里,我们考虑以下二种情况。

问题1。 如何调用父view的controller里面的方法?

答案如下:
[[self superview ].nextResponder  method];
[[[self superview ] nextResponder]  method];
[self.nextResponder method];
上面的都可以,看情况使用,使用的时候最好判断一下。

官方解释
UIView implements this method by returning the UIViewController object that manages it (if it has one) or its superview (if it doesn’t); UIViewController implements the method by returning its view’s superview; UIWindow returns the application object, and UIApplication returns nil.

即如下代码可以进行判断:

id next = [self nextResponder];
while(![next isKindOfClass:[ViewController class]])//这里跳不出来。。。有人说这里跳不出来,其实是因为它没有当前这个view放入ViewController中,自然也就跳不出来了,会死循环,使用时需要注意。
{
next = [next nextResponder];
}
if ([next isKindOfClass:[ViewController class]])
{
controller = (ViewController *)next;
}

问题2:当一个子view需要接收点击事件,而父view也需要接收点击事件, 如何做?

当然, 你可能会说直接调用mysubview.superView即可, 这样做也确实是可以做到,但有时子view是不一定知道有这个特定的父view的存在的,如动态添加子view。

所以这里就可以用到消息响应链拉技术。

下面要做的也就是,让子view接收这些事件后,同时把这些事件继续向上传,会一直传到UIApplication为止。 而在传的过程中,如果子view接收了这些事件,那么事件会自然终止,我们现在可以做的是同时让子view接收事件,而且还让事件不终止,并继续向上传。

摘取一部分说明:

当用户  与  iPhone的触摸屏  产生  互动时,硬件  就会探测到  物理接触  并且  通知  操作系统。接着  操作系统  就会创建  相应的事件  并且  将  其  传递给  当前正在运行的应用程序的事件队列。然后  这项事件  会被事件循环  传递给  优先响应者物件。优先响应者物件  是  事件  被触发时  和  用户  交互的物件,比如  按钮物件、视图物件。如果  我们  编写了  代码  让  优先响应者  处理  这种类型的事件,那么  它  就会处理  这种类型的事件。处理完  某项事件后,响应者  有  两个选项:1、将  其  丢弃;2、将  其  传递给  响应链条中的下一个响应者。下一个响应者的地址   存储  在当前响应者物件所包含的变量nextResponder当中。如果  优先响应者  无法处理  一项事件,那么  这项事件  就传递给  下一个响应者,直到  这项事件  到达  能处理它的响应者  或者  到达  响应链条的末端,也就是  UIApplication类型的物件。UIApplication类型的物件  收到  一项事件后,也是  要么  处理,要么  丢弃。

比如  有  一个视图物件,这个视图物件上  有  一个按钮物件。当用户  触摸  这个按钮物件时,作为优先响应者,这个按钮物件  就会收到  一项事件。如果  这个按钮物件  无法处理  这项事件,就会将  这项事件  传递给  视图物件。如果  视图物件  无法处理  这项事件,就会将  这项事件  传递给  视图控制器物件。以此类推。

应该注意的  是  当我们  在使用  响应链条时,一项事件  并不会自动地  从一个响应者  传递到  下一个响应者。如果  要将  一项事件  从一个响应者  传递到  下一个响应者,我们  必须编写  代码  才能办到。

要做的如下:

view的代码如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

// 这里可以做子view自己想做的事,做完后,事件继续上传,就可以让其父类,甚至父viewcontroller获取到这个事件了

[[selfnextResponder]touchesBegan:toucheswithEvent:event];

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

[[selfnextResponder]touchesEnded:toucheswithEvent:event];

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

[[selfnextResponder] touchesCancelled:toucheswithEvent:event];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

[[selfnextResponder] touchesMoved:toucheswithEvent:event];

}

另外需要注意的是:在重写这几个方法时,最好保证这几个方法都重写,否则事件响应链可能会变混乱。这是我的猜测哈,没有实际验证过。

iOS响应事件传递, nextResponder研究相关推荐

  1. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成 ...

  2. iOS —— 触摸事件传递及响应与手势

    iOS 的事件分为三种,触摸事件(Touch Event).加速器事件(Motion Events).远程遥控事件(Remote Events).这些事件对应的类为UIResponder.本文只探究触 ...

  3. iOS Touches事件传递

    直接上图: 上图直观的反映了touches事件的分发顺序和touches事件处理顺序: 一.事件分发顺序,目的找到被触摸的视图 1.iOS判断哪个界面能接受消息是从View层级结构的父View向子Vi ...

  4. iOS之深入解析事件传递的响应链

    一.UIResponder App 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...

  5. iOS中触摸事件传递和响应原理

    系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程. ma ...

  6. iOS 中的事件传递和响应机制 - 实践篇

    注:根据史上最详细的iOS之事件的传递和响应机制-实践篇重新整理(适当删减及补充). 示意图说明:白色 view 是蓝色 view 的父视图:蓝色 view 是橙色 view 的父视图. 需求一:点击 ...

  7. iOS事件的响应和传递机制

    跟二狗子哥哥交流的时候,他总说我,说的过程太业余.故 好好学习整理一下.努力不那么业余. 一.事件的产生.传递.响应: 1.事件从父控件依次传递到子控件,寻找最合适的子控件View. 2.寻找最合适的 ...

  8. iOS开发事件分发机制—响应链—手势影响

    1.提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2.事件分发机制 2.1.来源 以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UI ...

  9. iOS底层原理探究 第一探. 事件传递和响应者链

    一. 声明:  本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言:  最近自己做项目的时候, 用到了UITabbarContro ...

最新文章

  1. 定义ComboBox(下拉列表)组件垂直滚动条的样式。
  2. Esper——内存计算、事件驱动、SQL支持
  3. Zabbix服务端的安装及使用
  4. 分布式系统的面试题5
  5. Ubuntu 16.04 安装 ROS
  6. 这里有一份面筋请查收(六)
  7. Java面试之阻塞队列
  8. 什么影响matlab损失值,matlab – 在计算Logistic损失函数的值和梯度时避免数值溢出...
  9. Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
  10. oracle alter database close,alter database close
  11. Java编程的逻辑 (70) - 原子变量和CAS
  12. 双层优化模型【简述】
  13. 华为认证Datacom和Routing Switching方向的优势
  14. “我,从油漆工开始的80后,曾经靠副业的收入买车买房”
  15. css特殊边框形状_了解CSS边框角形状
  16. 5.2.6UART寄存器编程(下)
  17. 个人笔记 springboot整合shiro实现权限管理,前端使用vue 10155
  18. 原子操作(Atomic)
  19. 【数论】——Catalan 卡特兰数
  20. 51Nod 2075 图书管理员 c/c++题解

热门文章

  1. oracle经典博客,Oracle启动步骤【经典博客】
  2. html百度蜘蛛跳转代码,php搜索引擎劫持,百度蜘蛛劫持,搜索引擎蜘蛛劫持原理及代码分享...
  3. js调用c语言程序设计,HTML页面,测试JS对C函数的调用简单实例
  4. matlab综合实验研究,MATLAB综合实验报告.doc
  5. 八十一、最快最优的快速排序和优化
  6. 4g能用吗64java_java – 用于4G内存的JBoss 7内存配置,64位
  7. 零样本性能超越GPT-3!谷歌提出1370亿参数自回归语言模型
  8. ACL 2021 | 北京大学KCL实验室:如何利用双语词典增强机器翻译?
  9. 推荐系统入门必读:一文读懂推荐系统负采样
  10. mysql 设置某个字段等于某个字段_学习记录-第十八天(李玉婷MySQL基础 第12天)...