RACSubject替换代理

需求:
1.给当前控制器添加一个按钮,modal到另一个控制器界面
2.另一个控制器view中有个按钮,点击按钮,通知当前控制器

RACSubject替换代理_第1张图片
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");
    //    }];
}

你可能感兴趣的:(RACSubject替换代理)