RACSubject替換代理

weixin_33850890發表於2016-12-04

需求:
1.給當前控制器新增一個按鈕,modal到另一個控制器介面
2.另一個控制器view中有個按鈕,點選按鈕,通知當前控制器

3680843-8ca1074b5112131e.png
222.png

步驟一:在第二個控制器.h,新增一個RACSubject代替代理。

@interface TwoViewController : UIViewController

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

步驟二:監聽第二個控制器按鈕點選

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

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

步驟三:在第一個控制器中,監聽跳轉按鈕,給第二個控制器的代理訊號賦值,並且監聽.

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

    // 建立第二個控制器
    TwoViewController *twoVc = [[TwoViewController alloc] init];

    // 設定代理訊號
    twoVc.delegateSignal = [RACSubject subject];

    // 訂閱代理訊號
    [twoVc.delegateSignal subscribeNext:^(id x) {

        NSLog(@"點選了通知按鈕");
    }];

    // 跳轉到第二個控制器
    [self presentViewController:twoVc animated:YES completion:nil];

}
@end

代替代理:其實有2種方法

第一種就是上面用RACSubject
第二種就是rac_signalForSelector:監聽某物件有沒有呼叫某方法
這兩種方法的區別:只要傳值,就必須使用RACSubject

下面是第二種方法的用法

- (void)delegate
{
      [[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
        NSLog(@"控制器知道按鈕被點選");
    }];
    
    // RAC:
    // 把控制器呼叫didReceiveMemoryWarning轉換成訊號
    // rac_signalForSelector:監聽某物件有沒有呼叫某方法
    // [[self rac_signalForSelector:@selector(didReceiveMemoryWarning)] subscribeNext:^(id x) {
    //        NSLog(@"控制器呼叫didReceiveMemoryWarning");
    //    }];
}

相關文章