iOS响应事件传递, nextResponder研究
这里,我们考虑以下二种情况。
问题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研究相关推荐
- iOS开发 - 事件传递响应链
序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成 ...
- iOS —— 触摸事件传递及响应与手势
iOS 的事件分为三种,触摸事件(Touch Event).加速器事件(Motion Events).远程遥控事件(Remote Events).这些事件对应的类为UIResponder.本文只探究触 ...
- iOS Touches事件传递
直接上图: 上图直观的反映了touches事件的分发顺序和touches事件处理顺序: 一.事件分发顺序,目的找到被触摸的视图 1.iOS判断哪个界面能接受消息是从View层级结构的父View向子Vi ...
- iOS之深入解析事件传递的响应链
一.UIResponder App 使用响应者对象接收和处理事件,只有继承 UIResponder 的类,才能处理事件. UIApplication.UIView.UIViewController 都 ...
- iOS中触摸事件传递和响应原理
系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程. ma ...
- iOS 中的事件传递和响应机制 - 实践篇
注:根据史上最详细的iOS之事件的传递和响应机制-实践篇重新整理(适当删减及补充). 示意图说明:白色 view 是蓝色 view 的父视图:蓝色 view 是橙色 view 的父视图. 需求一:点击 ...
- iOS事件的响应和传递机制
跟二狗子哥哥交流的时候,他总说我,说的过程太业余.故 好好学习整理一下.努力不那么业余. 一.事件的产生.传递.响应: 1.事件从父控件依次传递到子控件,寻找最合适的子控件View. 2.寻找最合适的 ...
- iOS开发事件分发机制—响应链—手势影响
1.提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2.事件分发机制 2.1.来源 以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UI ...
- iOS底层原理探究 第一探. 事件传递和响应者链
一. 声明: 本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言: 最近自己做项目的时候, 用到了UITabbarContro ...
最新文章
- 定义ComboBox(下拉列表)组件垂直滚动条的样式。
- Esper——内存计算、事件驱动、SQL支持
- Zabbix服务端的安装及使用
- 分布式系统的面试题5
- Ubuntu 16.04 安装 ROS
- 这里有一份面筋请查收(六)
- Java面试之阻塞队列
- 什么影响matlab损失值,matlab – 在计算Logistic损失函数的值和梯度时避免数值溢出...
- Mac 屏幕可不可以用酒精清洁?正确清洁 Mac 的方法
- oracle alter database close,alter database close
- Java编程的逻辑 (70) - 原子变量和CAS
- 双层优化模型【简述】
- 华为认证Datacom和Routing Switching方向的优势
- “我,从油漆工开始的80后,曾经靠副业的收入买车买房”
- css特殊边框形状_了解CSS边框角形状
- 5.2.6UART寄存器编程(下)
- 个人笔记 springboot整合shiro实现权限管理,前端使用vue 10155
- 原子操作(Atomic)
- 【数论】——Catalan 卡特兰数
- 51Nod 2075 图书管理员 c/c++题解
热门文章
- oracle经典博客,Oracle启动步骤【经典博客】
- html百度蜘蛛跳转代码,php搜索引擎劫持,百度蜘蛛劫持,搜索引擎蜘蛛劫持原理及代码分享...
- js调用c语言程序设计,HTML页面,测试JS对C函数的调用简单实例
- matlab综合实验研究,MATLAB综合实验报告.doc
- 八十一、最快最优的快速排序和优化
- 4g能用吗64java_java – 用于4G内存的JBoss 7内存配置,64位
- 零样本性能超越GPT-3!谷歌提出1370亿参数自回归语言模型
- ACL 2021 | 北京大学KCL实验室:如何利用双语词典增强机器翻译?
- 推荐系统入门必读:一文读懂推荐系统负采样
- mysql 设置某个字段等于某个字段_学习记录-第十八天(李玉婷MySQL基础 第12天)...