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