RACSubject替換代理

需求:
1.給當(dāng)前控制器添加一個(gè)按鈕,modal到另一個(gè)控制器界面
2.另一個(gè)控制器view中有個(gè)按鈕,點(diǎn)擊按鈕,通知當(dāng)前控制器

222.png

步驟一:在第二個(gè)控制器.h,添加一個(gè)RACSubject代替代理。

@interface TwoViewController : UIViewController

@property (nonatomic, strong) RACSubject *delegateSignal;
@end

步驟二:監(jiān)聽(tīng)第二個(gè)控制器按鈕點(diǎn)擊

@implementation TwoViewController
- (IBAction)notice:(id)sender {
    // 通知第一個(gè)控制器,告訴它,按鈕被點(diǎn)了

     // 通知代理
     // 判斷代理信號(hào)是否有值
    if (self.delegateSignal) {
        // 有值,才需要通知
        [self.delegateSignal sendNext:nil];
    }
}
@end

步驟三:在第一個(gè)控制器中,監(jiān)聽(tīng)跳轉(zhuǎn)按鈕,給第二個(gè)控制器的代理信號(hào)賦值,并且監(jiān)聽(tīng).

@implementation OneViewController
- (IBAction)btnClick:(id)sender {

    // 創(chuàng)建第二個(gè)控制器
    TwoViewController *twoVc = [[TwoViewController alloc] init];

    // 設(shè)置代理信號(hào)
    twoVc.delegateSignal = [RACSubject subject];

    // 訂閱代理信號(hào)
    [twoVc.delegateSignal subscribeNext:^(id x) {

        NSLog(@"點(diǎn)擊了通知按鈕");
    }];

    // 跳轉(zhuǎn)到第二個(gè)控制器
    [self presentViewController:twoVc animated:YES completion:nil];

}
@end

代替代理:其實(shí)有2種方法

第一種就是上面用RACSubject
第二種就是rac_signalForSelector:監(jiān)聽(tīng)某對(duì)象有沒(méi)有調(diào)用某方法
這兩種方法的區(qū)別:只要傳值,就必須使用RACSubject

下面是第二種方法的用法

- (void)delegate
{
      [[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
        NSLog(@"控制器知道按鈕被點(diǎn)擊");
    }];
    
    // RAC:
    // 把控制器調(diào)用didReceiveMemoryWarning轉(zhuǎn)換成信號(hào)
    // rac_signalForSelector:監(jiān)聽(tīng)某對(duì)象有沒(méi)有調(diào)用某方法
    // [[self rac_signalForSelector:@selector(didReceiveMemoryWarning)] subscribeNext:^(id x) {
    //        NSLog(@"控制器調(diào)用didReceiveMemoryWarning");
    //    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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