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