響應(yīng)鏈信號傳遞

綜合參考鏈接的兩篇文章搞的

Update

2017-1-17

增強(qiáng)了一點(diǎn)功能“如果信號傳到控制器,則向navigationController push出這個(gè)控制器之前的控制器傳遞”

用途

用在多層級的視圖逆向傳值,用來代替block和通知和代理

條件

需要是responder的子類,并且是在一條響應(yīng)鏈上面,例如controller->view->view->button。

使用方法

//發(fā)送,例如
- (void)buttonClickAction:(UIButton *)sender {
    [sender sendYRUISignalForKey:YFTransferNameEvent userInfo:@{@"YFUserName" : [self userName]} callback:^(id receiver, id callbackData) {
        NSLog(@"%@",[receiver class]);
    }];
}
//實(shí)現(xiàn)方法,對信號進(jìn)行攔截:
- (BOOL)handleYRUISignal:(YRUISignal *)signal {
    if ([signal.name isEqualToString:YFTransferNameEvent]) {
        self.resultLabel.text = signal.userInfo[@"YFUserName"];
        if (signal.callBack) {
            signal.callBack(self,nil);
        }
        return NO;
    } else {
        return YES;
    }
}

為responder建的一個(gè)分類

.h文件

#import <UIKit/UIKit.h>
typedef void (^YRUISignalCallBack)(id receiver, id callbackData);

@interface YRUISignal : NSObject
@property (retain, nonatomic) NSString *name; //名字,唯一標(biāo)識
@property (assign, nonatomic) NSInteger tag;  //數(shù)字,輔助標(biāo)識
@property (retain, nonatomic) id userInfo;    //附帶信息或參數(shù)
@property (weak, nonatomic) id sender;   //發(fā)送者,應(yīng)當(dāng)是UIView或者UIViewController
@property (copy, nonatomic) YRUISignalCallBack callBack; //回調(diào)函數(shù),可用于處理者調(diào)用
@end

@protocol YRUISignalDelegate <NSObject>

/*!
 * @brief 處理某個(gè)信號,具體的是否處理該消息根據(jù)signal的name判別
 *
 * @param  signal  待處理的信號消息
 *
 * @return 如果返回是YES,則繼續(xù)傳遞消息,如果是NO,則中斷響應(yīng)鏈
 */
@optional
- (BOOL)handleYRUISignal:(YRUISignal *)signal;

@end

@interface UIResponder (Router)<YRUISignalDelegate>

- (void)sendYRUISignalForKey:(NSString *)signalKey userInfo:(id)userInfo callback:(YRUISignalCallBack)callback;

@end

.m文件

#import "UIResponder+Router.h"

@implementation YRUISignal

@end

@implementation UIResponder (Router)

- (void)sendYRUISignalForKey:(NSString *)signalKey userInfo:(id)userInfo callback:(YRUISignalCallBack)callback {
    YRUISignal *signal = [[YRUISignal alloc] init];
    signal.name = signalKey;
    signal.userInfo = userInfo;
    signal.callBack = callback;
    [self sendYRUISignal:signal];
}
- (void)sendYRUISignal:(YRUISignal *)signal {
    id nextSender;
    if ([self isKindOfClass:[UIViewController class]]) {
        //如果信號傳到控制器,則向navigationController push出這個(gè)控制器之前的控制器傳遞
        UIViewController *vc = (UIViewController *)self;
        if (vc.navigationController.childViewControllers.count > 0) {
            NSInteger index = [vc.navigationController.childViewControllers indexOfObject:vc];
            if (index > 0) {
                nextSender = vc.parentViewController.childViewControllers[index - 1];
            }
        }
    } else {
        //信號在響應(yīng)鏈中傳遞
        nextSender = self.nextResponder;
    }
    if (nextSender) {
        if ([nextSender respondsToSelector:@selector(handleYRUISignal:)]) {
            if ([nextSender handleYRUISignal:signal]) {
                [nextSender sendYRUISignal:signal];
            } else {
                return;
            }
        } else {
            [nextSender sendYRUISignal:signal];
        }
    }
}

參考鏈接

iOS中UI事件處理YRUISignal
路由響應(yīng)鏈方法進(jìn)行傳值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,836評論 25 709
  • 在iOS開發(fā)中經(jīng)常會涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,237評論 4 26
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,116評論 4 61
  • 文/恰恰天藍(lán) 1 「能辦成這個(gè)事的才叫能力,公司那些人只是做些提供資料的小事?!?前幾天在政府辦事過程中另一公司美...
    恰恰天藍(lán)閱讀 267評論 0 1
  • 之前不過是看了一遍《活著》的簡介,內(nèi)心郁郁了好些天,終歸沒有勇氣翻閱。 那些故事太沉痛,那段人生太悲慘,仿佛是永遠(yuǎn)...
    發(fā)呆的音樂臺閱讀 289評論 0 0

友情鏈接更多精彩內(nèi)容