既然是組件間通訊,這里所說的組件就是業(yè)務組件。
跳轉(zhuǎn)
實際就是控制器A跳轉(zhuǎn)到控制器B,控制器B作為某個組件的一個入口。
我們使用的方式是Target-Action,用到了一個三方CTMediator

看圖,為了簡化我們假設某個組件只有一個控制器SecondViewController。
要想不引入SecondViewController而跳到該控制器且可以傳值,我們還需要額外的兩個類CTMediator+TASecondVC和Target_TASecondVC。
CTMediator+TASecondVC(負責傳值和獲取目標控制器)
這是一個CTMediator的分類,我們在跳到SecondViewController的時候需要使用此分類的方法,它的方法是暴露給其他組件調(diào)用者的。
Target_TASecondVC(負責傳值和返回目標控制器)
這個類是CTMediator+TASecondVC需要用到的,它會返回我們要跳轉(zhuǎn)的VC以及傳值給該VC。這個類是不會暴露給其他組件調(diào)用者的。
使用
現(xiàn)在我們要跳轉(zhuǎn)到SecondViewController
UIViewController * vc = [[CTMediator sharedInstance] secondVCWithName:@"我"];
if (vc) {
[self presentViewController:vc animated:YES completion:nil];
}
代碼很簡單,并且沒有SecondViewController的出現(xiàn),其中的secondVCWithName方法是CTMediator+TASecondVC分類中的方法,參數(shù)是我們傳的值。
我們看下secondVCWithName:方法的具體實現(xiàn):
- (UIViewController *)secondVCWithName:(NSString *)name{
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
parameters[@"name"] = name;
return [self performTarget:@"TASecondVC" action:@"SecondVC" params:parameters shouldCacheTarget:NO];
}
這個類雖然需要Target_TASecondVC的支持,但并沒有引入該類,而是通過調(diào)用CTMedia的方法實現(xiàn)的,CTMedia中使用runtime來實現(xiàn)找到某個類并調(diào)用這個類的某個方法。其調(diào)用的方法就是- (id)performTarget:(NSString *)targetName action:(NSString *)actionName params:(NSDictionary *)params shouldCacheTarget:(BOOL)shouldCacheTarget。
performTarget后的參數(shù)是方法調(diào)用類,action后的參數(shù)該要要調(diào)用的方法。
看Target_TASecondVC的具體實現(xiàn)。
- (UIViewController *)Action_SecondVC:(NSDictionary *)parameters{
SecondViewController * secondVC = [SecondViewController new];
secondVC.name = parameters[@"name"];
return secondVC;
}
注意:
你會發(fā)現(xiàn)target的參數(shù)是"TASecondVC",而我們的類名是Target_TASecondVC,action的參數(shù)是"SecondVC",而我們實際調(diào)用的方法名是Action_SecondVC。感覺類名少了"Target_",方法名少了·"Action_"這是因為CTMedia內(nèi)部為類名和方法加了這兩個前綴。
正向傳值
正向傳值就像我們前面介紹的直接把參數(shù)拼接在方法里就好了。
反向傳值
反向傳值我們需要利用到block回調(diào),將block作為方法的一個參數(shù)。
這里列出CTMedia分類的方法和Target_類的方法
- (UIViewController *)thirdVCWithName:(NSString *)name callBack:(dispatch_block_t)callBack{
NSMutableDictionary * parameters = [NSMutableDictionary dictionary];
parameters[@"name"] = name;
parameters[@"callBack"] = callBack;
return [self performTarget:@"TAThirdVC" action:@"thirdVC" params:parameters shouldCacheTarget:NO];
}
- (UIViewController *)Action_thirdVC:(NSDictionary *)parameters{
ThirdViewController * thirdVC = [ThirdViewController new];
thirdVC.name = parameters[@"name"];
thirdVC.callBack = parameters[@"callBack"];
return thirdVC;
}
問題
傳參的時候有硬編碼
附上一個小demo供大家參考:https://github.com/yangguanghei/Media-demo