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許可證