iOS开发-事件的传递链和响应链

前言

当我们点击屏幕的时候,就产生了一个点击事件,那程序是如何知道这个点击事件应该由来处理?

响应者

在iOS中,能够响应事件的就是响应者,而所有响应者都是UIResponser的子类,例如:UIViewUIButtonUIControlUIWindowUIViewControllerAppDelegateUIApplication以及它们的子类。

UIResponder声明了各种点击事件的处理,比如点击,按压,移动等。

响应链

响应链就是响应者都连接一起的一个链条的层级关系,说是链条其实更类似树结构。

这个链条从程序开始运行时就建立并不断将响应者链接进来。

我们都知道程序运行后,UIApplication会生成一个单例,并与AppDelegate进行关联。而AppDelegate就作为整个响应链的根建立存在,接着UIApplication的单例就会作为响应者链接在根上,即[UIApplication sharedApplication].nextResponser = AppDelegate

当任何一个UIWindow被创建时,UIWindow都会自动链接在UIApplication的单例上,即把UIWindownextResponser设置为UIApplication的单例。

UIWindow设置rootViewController时,rootViewController就会链接在UIWindow上。

UIViewController初始化loadView时, UIViewControllerview就会链接在UIViewController上。

addSubView的操作过程中,subViewnextResponser会被设置为superView

举例验证环节:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    self.window.rootViewController = [[ViewController alloc] init];
    [self.window makeKeyAndVisible];
    return YES;
}
 
- (void)viewDidAppear:(BOOL)animated {
   
    [super viewDidAppear:animated];
    UIView *view = [[UIView alloc] init];
    [self.view addSubview:view];
    
    UILabel *label = [[UILabel alloc] init];
    [view addSubview:label];
    [self logOutResponderChain:label];
}

- (void)logOutResponderChain:(UIResponder *)responder {
   
    UIResponder *nextResponder = responder.nextResponder;
    NSLog(@"%@ -> ", NSStringFromClass([responder class]));
    while (nextResponder) {
   
        NSLog(@"%@ -> ", NSStringFromClass([nextResponder class]));
        nextResponder = nextResponder.nextResponder;
    }
    NSLog(@"*");
}

打印结果如下:

UILabel -> UIView -> UIView -> ViewController -> 
UIDropShadowView -> UITransitionView -> 
UIWindow -> UIWindowScene -> UIApplication -> AppDelegate -> *

传递链

通过上文,我们已经知道了响应链是如何建立的,而建立响应链就是为了让事件能找到对应的处理者,而找到处理者的过程称之为事件的传递链。

这里先给出结论:
(1)当用户点击屏幕触发事件,系统硬件进程会获取到这个事件,将事件简单处理封装后存到系统中,系统接着将事件转交到UIApplication管理的事件队列中。(这一部分涉及RunLoop和端口通信)
(2)UIApplication会从事件队列中取出最前面的事件,并将事件顺着响应链分发下去,寻找合适的控件进行处理。
(3)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值