ResponderChain 界面间事件传递

2018-03-30  本文已影响0人  RichieQ

一、简介

反应链模式是通过在UIResponder上挂一个category,使得事件和参数可以沿着responder chain逐步传递。这相当于借用responder chain实现了一个自己的事件传递链。

二、使用场景

这在事件需要层层传递的时候特别好用。比如复杂的Cell界面上的按钮事件要传递到VC,如果用以前delegate方式,就需要多个delegate进行层层传递,现在是要包含下UIResponder+Router.h即可做到事件层层传递
详细说明请移步到Casa大神关于ResponderChain的对象交互方式

三、使用 cell->VC传递

1、Cell里面代码如下

#import "UIResponder+ChainResponder.h"
...
-(void)tap
{
    [self handAction:@"某个Cell" withObject:@"heihei"];
}
-(BOOL)chainRouter:(NSString *)identifier withObject:(id)object
{
   //这里也可以处理下 不如按钮点击的ui处理  不处理就直接传递给nextresponder;
    return YES;
}
...

2、VC里面代码如下

#import "UIResponder+ChainResponder.h"
...
-(BOOL)chainRouter:(NSString *)identifier withObject:(id)object
{
    NSLog(@"vc页面收到%@的数据做处理  object 为数据  return NO  不在往下传递",identifier);
    
    return NO;
}
...

3、UIResponder+ChainResponder.h

#import <UIKit/UIKit.h>

@interface UIResponder (ChainResponder)

-(void)handAction:(NSString *)identifier withObject:(id)object;

-(BOOL)chainRouter:(NSString *)identifier withObject:(id)object;

@end

4 、UIResponder+ChainResponder.m

#import "UIResponder+ChainResponder.h"

@implementation UIResponder (ChainResponder)

-(void)handAction:(NSString *)identifier withObject:(id)object
{
    if ([self chainRouter:identifier withObject:object] && self.nextResponder) {
        [self.nextResponder handAction:identifier withObject:object];
    }
}

-(BOOL)chainRouter:(NSString *)identifier withObject:(id)object
{
    //如果是yes  就往下传递 如果NO  就在当前页面处理就结束了 是实现消息链传递的最好方法
    return YES;
}
@end

四、代码用例(取自别人滴)

https://github.com/bajiejiedian/ResponderChain
https://github.com/hunterxie/ResponderChain

上一篇下一篇

猜你喜欢

热点阅读