美文网首页MVVM+RAC
RACSubject替换代理

RACSubject替换代理

作者: 小胖子2号 | 来源:发表于2016-12-04 17:52 被阅读104次

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

    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替换代理

        本文链接:https://www.haomeiwen.com/subject/ekbhmttx.html