需求:
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");
// }];
}