iOS 利用Router機(jī)制進(jìn)行動態(tài)跳轉(zhuǎn)ViewController

Overview:


在多人開發(fā)環(huán)境中時(shí)常某個(gè)ViewController會引入大量的其他ViewController埂淮,例如:FirstViewController會引入SecondViewController磕秤、ThirdViewController仆抵。

大家肯定會遇見如下情景:

1. 個(gè)別時(shí)候由于需求的變更會時(shí)常修改ViewController名字镀钓,這樣也就造成了個(gè)別文件需要手動修改名字。

2. 如果兩個(gè)人在開發(fā)兩個(gè)ViewController喘先,如果同學(xué)A需要引入同學(xué)B的Controller時(shí)翘鸭,只能讓同學(xué)B開發(fā)者先把這個(gè)類submit一下,或者有其他解決方案鸳址。

3. 等等等

總之在iOS Develop里面#import "XxxViewController.h"這句話可謂是出現(xiàn)頻率最高的一項(xiàng)了瘩蚪。尤其現(xiàn)在xcode時(shí)常無法尋找到其他類名,要死啦稿黍!

下面我給大家介紹一款全新的ViewController跳轉(zhuǎn)方式疹瘦,從此不用再需要import其他類了。

Open Source Framework HHRouter


HHRouter介紹:https://github.com/Huohua/HHRouter

HHRouter 不依賴于其他庫巡球,自己實(shí)現(xiàn)了一套簡單的 Mapping 算法言沐,性能特別不錯(cuò),更優(yōu)于同類Router框架酣栈,特別值得推薦使用险胰,因?yàn)楣δ軉我唬孕阅芎軓?qiáng)矿筝,簡單可依賴起便!

Simple Demo


我們只需要在AppDelegate.m里面引入如下代碼:

[[HHRouter shared] map:@"one" toControllerClass:[OneViewController class]];

現(xiàn)在我們在任何一個(gè)ViewController里面去跳轉(zhuǎn)這個(gè)OneViewController時(shí),不需要在import這個(gè)文件了窖维,只需要:

ViewController *vc = [[HHRouter shared] matchController:@"one"];

[self.navigationController pushViewController:vc animated:YES];

感覺是不是很簡單坝茏邸?So easy铸史!

如果你只想頁面跳轉(zhuǎn)跳轉(zhuǎn)不需要考慮傳值到此為止就可以了鼻疮。

進(jìn)階!


傳值

如果你想跳轉(zhuǎn)的同時(shí)還要進(jìn)行屬性傳值琳轿,那么你只需要在定義Router時(shí)候改為如下即可:

[[HHRouter shared] map:@"/user/:userId/" toControllerClass:[UserViewController class]];

跳轉(zhuǎn)的時(shí)候改為如下:

ViewController *vc = [[HHRouter shared] matchController:@"/user/1/"];

[self.navigationController pushViewController:vc animated:YES];

在UserViewController里面加入測試:

NSLog(@"%@", self.params[@"userId"]);

輸出:1

原理

因?yàn)楫?dāng)使用URL傳值的時(shí)候陋守,HHRouter會把相應(yīng)的key和value放在params字典里面,params屬性是在UIViewController Category里定義的:

@interface UIViewController (HHRouter)

@property (nonatomic, strong) NSDictionary *params;

@end

URL查詢參數(shù)


URL查詢參數(shù)也是支持利赋,并且使用起來非常簡單!

UIViewController *viewController = [[HHRouter shared] matchController:@"/user/1/?tabIndex=3"];

NSLog(@"%@", viewController.params[@"tabIndex"]);

輸出:3

URL Schemes


如果你的app已經(jīng)定義了一些URL schemes猩系,HHRouter也可以解決媚送。

UIViewController *viewController = [[HHRouter shared] matchController:@"hhrouter://user/1/"];

[viewController class] 等于 [UserViewController class]

UserViewController里面的params[@"userId"]值等于1

Block


- (void)map:(NSString *)route toBlock:(HHRouterBlock)block;

- (HHRouterBlock)matchBlock:(NSString *)route;

- (id)callBlock:(NSString *)route;

HHRouter還支持Block回調(diào),如果感興趣的同學(xué)可以看下.h文件寇甸,使用方式和視圖跳轉(zhuǎn)是一樣的塘偎!

Block定義

[[HHRouter shared] map:@"block1" toBlock:^id(NSDictionary *params) {

NSLog(@"%@", params);

return @"test";

}];

因?yàn)榉祷刂凳莍d類型疗涉,所以,你可以返回?cái)?shù)組吟秩,字典等等都可以咱扣!

調(diào)用有兩種方式:

第一種:

HHRouterBlock block = [[HHRouter shared] matchBlock:@"block1"];

NSLog(@"%@", block(@{@"aaaaaa": @"aaaaa"}));

輸出:

{

aaaaaa = aaaaa;

block = "<__NSGlobalBlock__: 0x1081a5120>";

route = block1;

}

test

第二種:

NSLog(@"%@", [[HHRouter shared] callBlock:@"block1"]);

輸出:

{

block = "<__NSGlobalBlock__: 0x1081a5120>";

route = block1;

}

test

細(xì)心的同學(xué)看出來來了吧?

第一種調(diào)用方式會返回一個(gè)block可以往里面進(jìn)行傳值涵防。

第二種是直接調(diào)用無需進(jìn)行傳值操作闹伪。

各位可以根據(jù)自己的業(yè)務(wù)需求來進(jìn)行選擇。

安裝


CocoaPods

pod 'HHRouter', '~> 0.1.5'

手動

直接把GitHub里面的HHRouter.h和HHRouter.m文件引入到你的項(xiàng)目里面即可壮池。

在你需要的ViewController里面import:

#import "HHRouter.h"

許可證:

HHRouter遵循MIT許可證

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偏瓤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椰憋,更是在濱河造成了極大的恐慌厅克,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橙依,死亡現(xiàn)場離奇詭異证舟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窗骑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門女责,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慧域,你說我怎么就攤上這事鲤竹。” “怎么了昔榴?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵辛藻,是天一觀的道長。 經(jīng)常有香客問我互订,道長吱肌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任仰禽,我火速辦了婚禮氮墨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吐葵。我一直安慰自己规揪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布温峭。 她就那樣靜靜地躺著猛铅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凤藏。 梳的紋絲不亂的頭發(fā)上奸忽,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天堕伪,我揣著相機(jī)與錄音,去河邊找鬼栗菜。 笑死欠雌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疙筹。 我是一名探鬼主播富俄,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腌歉!你這毒婦竟也來了蛙酪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翘盖,失蹤者是張志新(化名)和其女友劉穎桂塞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馍驯,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阁危,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汰瘫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狂打。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖混弥,靈堂內(nèi)的尸體忽然破棺而出趴乡,到底是詐尸還是另有隱情,我是刑警寧澤蝗拿,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布晾捏,位于F島的核電站,受9級特大地震影響哀托,放射性物質(zhì)發(fā)生泄漏惦辛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一仓手、第九天 我趴在偏房一處隱蔽的房頂上張望胖齐。 院中可真熱鬧,春花似錦嗽冒、人聲如沸呀伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽区匠。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驰弄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工速客, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戚篙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓溺职,卻偏偏與公主長得像岔擂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子浪耘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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