一.responder对象
在iOS系统中,能够响应并处理事件的对象称之为responder object,UIResponder是所有responder对象的基类,在UIResponder类中定义了处理各种事件,包括触摸事件(Touch
Event)、运动事件(Motion Event)和远程控制事件(Remote-Control Events)的编程接口,其中处理触摸事件(Touch Event)的编程接口如下:
–
touchesBegan:withEvent:
–
touchesMoved:withEvent:
–
touchesEnded:withEvent:
–
touchesCancelled:withEvent:
这四个方法分别处理触摸开始事件,触摸移动事件,触摸终止事件,以及触摸跟踪取消事件。
UIApplication,UIViewController,UIView和所有继承自UIView的UIKit类(包括UIWindow,继承自UIView)都直接或间接的继承自UIResponder,所以它们的实例都是responder object对象,都实现了上述4个方法。UIResponder中的默认实现是什么都不做,但UIKit中UIResponder的直接子类(UIView,UIViewController…)的默认实现是将事件沿着responder chain继续向上传递到下一个responder,即nextResponder。所以在定制UIView子类的上述事件处理方法时,如果需要将事件传递给next responder,可以直接调用super的对应事件处理方法,super的对应方法将事件传递给next responder,即使用
[super touchesBegan:touches withEvent:event];
不建议直接向nextResponder发送消息,这样可能会漏掉父类对这一事件的其他处理。
[self.nextResponder touchesBegan:touches withEvent:event];
另外,在定制UIView子类的事件处理方法时,如果其中一个方法没有调用super的对应方法,则其他方法也需要重写,不使用super的方法,否则事件处理流程会很混乱。
注:UIKit框架的类层次结构图见:UIKit Framework Reference
二.responder chain
上文提到了responder chain,responder chain是一系列连接的responder对象,通过responder对象可以将处理事件的责任传递给下一个,更高级的对象,即当前responder对象的nextResponder。
iOS中responder chain的结构为:
- UIView的nextResponder属性,如果有管理此view的UIViewController对象,则为此UIViewController对象;否则nextResponder即为其superview。
- UIViewController的nextResponder属性为其管理view的superview.
- UIWindow的nextResponder属性为UIApplication对象。
- UIApplication的nextResponder属性为nil。
iOS系统在处理事件时,通过UIApplication对象和每个UIWindow对象的sendEvent:方法将事件分发给具体处理此事件的responder对象(对于触摸事件为hit-test view,其他事件为first responder),当具体处理此事件的responder不处理此事件时,可以通过responder chain交给上一级处理。
- 如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。
- 如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。
- 视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.
- 若UIApplication对象不处理此事件,则事件被丢弃。
三.巧妙利用nextResponder
通过UIViewController的view属性可以访问到其管理的view对象,及此view的所有subviews。但是根据一个view对象,没有直接的方法可以得到管理它的viewController,但我们使用responder chain可以间接的得到,代码如下:
@implementation UIView (ParentController)
-(UIViewController*)parentController{
UIResponder *responder = [self nextResponder];
while (responder) {
if ([responder isKindOfClass:[UIViewController class]]) {
return (UIViewController*)responder;
}
responder = [responder nextResponder];
}
return nil;
}
@end
from:http://www.winddisk.com/2012/10/13/responder-chain%E7%AE%80%E6%9E%90/
相关推荐
将ResponderChain附加为environmentObject。 // In the SceneDelegate or ApplicationDelegate where you have access to the window: let rootView = Example (). environmentObject ( ResponderChain ( for...
and architectures of the Cocoa Touch framework (including delegation, the responder chain, key–value coding, key–value observing, memory management, and so on), has been relegated to iOS 11 ...
LLMNR欺骗工具Responder .docx
内网渗透之Responder攻防(上)1
Laravel开发-responder 使用Fluent分形API转换Laravel雄辩模型
Laravel开发-laravel-responder 一个最小但功能强大的包,为您提供重构控制器的机会。
Laravel开发-api-responder Laravel API响应帮助程序
主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下
资源来自pypi官网。 资源全名:responder-0.1.2.tar.gz
Api-laravel-responder.zip,一个用于构建api响应的laravel分形包,它赋予了你分形与laravel优雅的力量。laravel响应器是一个用于构建api响应的包,将分形集成到laravel和lumen中。它可以使用transformers转换数据,...
Responder: 一个熟悉的Python HTTP服务框架
一、数字抢答器设计 设计一个数字抢答器系统,该系统具有三路抢答输入,能够识别最先抢答的信号,能对回答问题所用的时间进行计时、显示,能进行抢答报警及超时报警,具有记分和复位功能。 二、数字抢答器的设计要求...
Patterns that empower, such as singleton, delegates, and the responder chain Patterns that hide complexity, including bundles, class clusters, proxies and forwarding, and controllers
responder.pdsprj
键盘收缩切换firstResponder管理器https://github.com/xiaouhu/BXHKeyBoardManager.git bxh_registToKeyBoardManager bxh_unregistToKeyBoardManager 对应出现 不需要的时候及时bxh_unregistToKeyBoardManager
响应者Responder 旨在侦听多个事件源,并提供一种简单的方法来确定如何响应它们。本地设置确保当前的 CLI 配置文件设置为您的目标 AWS 账户的管理员权限。 将此存储库本地克隆到您的计算机。 全局安装 npm install -...
keil C程序,proteus仿真电路图都有。我自己做过的作品,好用