美文网首页
响应链Responder

响应链Responder

作者: KB_MORE | 来源:发表于2020-08-07 10:52 被阅读0次

一.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的结构为:

图片.png
UIResponder *resp = ben;

do {
    resp = resp.nextResponder;
    NSLog(@"%@",[resp class]);
} while (resp.nextResponder);

输出日志


图片.png
  • 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交给上一级处理。

UIApplication or UIWindow

- (void)sendEvent:(UIEvent *)event;                    // called by UIApplication to dispatch events to views inside the window

UIView

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system  
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;   // default returns YES if point is in bounds

  1. 如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。
  2. 如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。
  3. 视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.
  4. 若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

相关文章

  • iOS 响应者链 整理

    一、响应者链(Responder Chain) 先来说说响应者对象(Responder Object),顾名思义,...

  • 响应链相关知识点

    术语 hit-testing 点击检测 responder chain 响应链 响应链可以做...

  • 基于ResponderChain的事件传递

    ResponderChain对象交互方式本质 响应者链简介 Responder Chain也就是响应链,响应者链是...

  • iOS 疯狂讲义(下)整理

    1、响应者链 First Responder --> First Responder 的视图控制器 --> 父容器...

  • iOS 响应者链 在View中实现页面跳转

    响应者链(Responder Chain) (1)响应者对象(response Object)指的是有响应和处理”...

  • 响应链Responder

    一.responder对象 在iOS系统中,能够响应并处理事件的对象称之为responder object, UI...

  • 响应链(四)

    Altering the Responder Chain 变更响应链 You can alter the resp...

  • 响应者链

    1.1 响应者链 当与某控件交互时,该控件将作为"第一响应者 (First Responder)",作为响应者链的...

  • 事件处理流程--响应者链

    事件分发:自上而下响应者链:自下而上 第一响应者(First responder)指的是当前接受触摸的响应者对象,...

  • Responder Chain - 响应链

    响应链 响应链由一个个UIResponder的子类构成的,UIResponder是系统一个负责接受和处理事件的类。...

网友评论

      本文标题:响应链Responder

      本文链接:https://www.haomeiwen.com/subject/wmxfdktx.html