50.Target-Action 實現(xiàn)組件解耦 —— CTMediator使用教程(Target_Action頁面跳轉 1,創(chuàng)建Target-Action 在這個類里邊主要生成NewsViewC...

iOS組件化方案調(diào)研 這篇中,對組件化的應用場景和實現(xiàn)方式做了簡單的調(diào)研旷余。最終在項目中采用的是 casa 的 CTMediator 這套方案。以下是CTMediator 的一個簡單的使用教程扁达。

一正卧、普通頁面跳轉用法

假設我們有個頁面叫 OneViewController,當前頁面為 HomeViewController跪解,普通情況下頁面的間的跳轉方式如下:

#import "HomeViewController.h"
#import "OneViewController.h"

@implementation HomeViewController

- (void)aButtonClick:(UIButton *)sender {
    OneViewController *viewController = [[OneViewController alloc] init];
    viewController.name = @"普通用法";  //傳遞必要參數(shù)
    [self.navigationController pushViewController:viewController animated:YES];
}

@end

這樣做看上去沒什么問題炉旷,實際也沒什么問題。
但是,考慮以下情況:

1窘行,如果HomeViewController 里有 N 個這樣的 button事件饥追,每個點擊后的跳轉都是不同的頁面,那么則 HomeViewController 里抽高,需要導入 N 個這樣的 OneViewController.h;
2判耕,如果HomeViewController 是一個可以移植到其它項目的業(yè)務模塊,在拖出首頁 HomeVC 相關的業(yè)務代碼時翘骂,難道還要把 HomeViewController.m 導入的 N 個其它 XxxViewController.h 都一塊拖到新項目中么壁熄?
這點就是因為代碼的耦合導致了首頁 HomeVC 沒法方便的移植。
說這樣沒有問題碳竟,是因為普通情況下草丧,我們并沒有移植 HomeVC 到其它項目的需求。
至于什么時候會有這樣的問題莹桅,以及昌执,這樣的問題如果解決,在 iOS組件化方案調(diào)研這篇中诈泼,已經(jīng)做過簡單的討論懂拾,這篇主要是選取了我個人較偏向的 Target-Action 這套方案,簡單講一下實現(xiàn)方式铐达。

二岖赋、Target-Action 實現(xiàn)頁面跳轉

采用的是 CTMediator 這套方案
Demo地址

還是假設我們有個頁面叫 NewsViewController, 當前頁面為HomeViewController
那么,我們按照CTMediator設計的架構來寫一遍這個流程

1.創(chuàng)建Target-Action

創(chuàng)建一個 Target_News 類瓮孙,在這個文件里唐断,我們主要生成 NewsViewController 實例并為其進行一些必要的賦值。例如:

// Target_News.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Target_News : NSObject

- (UIViewController *)Action_NativeToNewsViewController:(NSDictionary *)params;

@end

這個類需要直接 #import "NewsViewController.h"

// Target_News.m

#import "Target_News.h"
#import "NewsViewController.h"

@implementation Target_News

- (UIViewController *)Action_NativeToNewsViewController:(NSDictionary *)params {
    NewsViewController *newsVC = [[NewsViewController alloc] init];
    
    if ([params valueForKey:@"newsID"]) {
        newsVC.newsID = params[@"newsID"];
    }
    
    return newsVC;
}

@end

2.創(chuàng)建 CTMediator 的Category.

CTMediator+NewsActions.這個Category利用Runtime調(diào)用我們剛剛生成的Target_News杭抠。

由于利用了Runtime脸甘,導致我們完全不用#import剛剛生成的Target_News即可執(zhí)行里面的方法,所以這一步偏灿,兩個類是完全解耦的丹诀。也即是說,我們在完全解耦的情況下獲取到了我們需要的NewsViewController菩混。例如:

// CTMediator+NewsActions.h

#import "CTMediator.h"
#import <UIKit/UIKit.h>

@interface CTMediator (NewsActions)

- (UIViewController *)yt_mediator_newsViewControllerWithParams:(NSDictionary *)dict;

@end
// CTMediator+NewsActions.m

#import "CTMediator+NewsActions.h"

NSString * const kCTMediatorTarget_News = @"News";
NSString * const kCTMediatorActionNativTo_NewsViewController = @"NativeToNewsViewController";

@implementation CTMediator (NewsActions)

- (UIViewController *)yt_mediator_newsViewControllerWithParams:(NSDictionary *)dict {
    
    UIViewController *viewController = [self performTarget:kCTMediatorTarget_News
                                                    action:kCTMediatorActionNativTo_NewsViewController
                                                    params:dict];
    if ([viewController isKindOfClass:[UIViewController class]]) {
        return viewController;
    } else {
        NSLog(@"%@ 未能實例化頁面", NSStringFromSelector(_cmd));
        return [[UIViewController alloc] init];
    }
}

@end

3.最終使用

由于在Target中忿墅,傳遞值得方式采用了去Model化得方式,導致我們在整個過程中也沒有#import任何Model沮峡。所以疚脐,我們的每個類都與Model解耦。

// HomeViewController.m

#import "HomeViewController.h"
#import "CTMediator+NewsActions.h"

@implementation HomeViewController

- (void)bButtonClick:(UIButton *)sender {    
    UIViewController *viewController = [[CTMediator sharedInstance] yt_mediator_newsViewControllerWithParams:@{@"newsID":@"123456"}];
    [self.navigationController pushViewController:viewController animated:YES];
}
@end

4.不足

這里其實唯一的問題就是邢疙,Target_Action里不得不填入一些 Hard Code棍弄,就是對創(chuàng)建的VC的賦值語句望薄。不過這也是為了達到最大限度的解耦和靈活度而做的權衡。

//  1. kCTMediatorTarget_News字符串 是 Target_xxx.h 中的 xxx 部分
NSString * const kCTMediatorTarget_News = @"News";

//  2. kCTMediatorActionNativTo_NewsViewController 是 Target_xxx.h 中 定義的 Action_xxxx 函數(shù)名的 xxx 部分
NSString * const kCTMediatorActionNativTo_NewsViewController = @"NativeToNewsViewController";

注:這篇寫的較早呼畸。作者前段時間也親自寫了篇教程:在現(xiàn)有工程中實施基于CTMediator的組件化方案 比這篇詳盡痕支,各位還是移步原 po 的教程吧……

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛮原,隨后出現(xiàn)的幾起案子卧须,更是在濱河造成了極大的恐慌,老刑警劉巖儒陨,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花嘶,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹦漠,警方通過查閱死者的電腦和手機椭员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛园,“玉大人隘击,你說我怎么就攤上這事⊙忻” “怎么了埋同?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棵红。 經(jīng)常有香客問我莺禁,道長,這世上最難降的妖魔是什么窄赋? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮楼熄,結果婚禮上忆绰,老公的妹妹穿的比我還像新娘。我一直安慰自己可岂,他們只是感情好错敢,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缕粹,像睡著了一般稚茅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上平斩,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天亚享,我揣著相機與錄音,去河邊找鬼绘面。 笑死欺税,一個胖子當著我的面吹牛侈沪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晚凿,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼亭罪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歼秽?” 一聲冷哼從身側響起应役,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燥筷,沒想到半個月后箩祥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡荆责,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年滥比,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片做院。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡盲泛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出键耕,到底是詐尸還是另有隱情寺滚,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布屈雄,位于F島的核電站村视,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酒奶。R本人自食惡果不足惜蚁孔,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惋嚎。 院中可真熱鬧杠氢,春花似錦、人聲如沸另伍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摆尝。三九已至温艇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕汞,已是汗流浹背勺爱。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讯检,地道東北人邻寿。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓蝎土,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绣否。 傳聞我的和親對象是個殘疾皇子誊涯,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容