Overview:
在多人開發環境中時常某個ViewController會引入大量的其他ViewController,例如:FirstViewController會引入SecondViewController、ThirdViewController。
大家肯定會遇見如下情景:
1. 個別時候由于需求的變更會時常修改ViewController名字,這樣也就造成了個別文件需要手動修改名字。
2. 如果兩個人在開發兩個ViewController,如果同學A需要引入同學B的Controller時,只能讓同學B開發者先把這個類submit一下,或者有其他解決方案。
3. 等等等
總之在iOS Develop里面#import "XxxViewController.h"這句話可謂是出現頻率最高的一項了。尤其現在xcode時常無法尋找到其他類名,要死啦!
下面我給大家介紹一款全新的ViewController跳轉方式,從此不用再需要import其他類了。
Open Source Framework HHRouter
HHRouter介紹:https://github.com/Huohua/HHRouter
HHRouter 不依賴于其他庫,自己實現了一套簡單的 Mapping 算法,性能特別不錯,更優于同類Router框架,特別值得推薦使用,因為功能單一,所以性能很強,簡單可依賴!
Simple Demo
我們只需要在AppDelegate.m里面引入如下代碼:
[[HHRouter shared] map:@"one" toControllerClass:[OneViewController class]];
現在我們在任何一個ViewController里面去跳轉這個OneViewController時,不需要在import這個文件了,只需要:
ViewController *vc = [[HHRouter shared] matchController:@"one"];
[self.navigationController pushViewController:vc animated:YES];
感覺是不是很簡單啊?So easy!
如果你只想頁面跳轉跳轉不需要考慮傳值到此為止就可以了。
進階!
傳值
如果你想跳轉的同時還要進行屬性傳值,那么你只需要在定義Router時候改為如下即可:
[[HHRouter shared] map:@"/user/:userId/" toControllerClass:[UserViewController class]];
跳轉的時候改為如下:
ViewController *vc = [[HHRouter shared] matchController:@"/user/1/"];
[self.navigationController pushViewController:vc animated:YES];
在UserViewController里面加入測試:
NSLog(@"%@", self.params[@"userId"]);
輸出:1
原理
因為當使用URL傳值的時候,HHRouter會把相應的key和value放在params字典里面,params屬性是在UIViewController Category里定義的:
@interface UIViewController (HHRouter)
@property (nonatomic, strong) NSDictionary *params;
@end
URL查詢參數
URL查詢參數也是支持,并且使用起來非常簡單!
UIViewController *viewController = [[HHRouter shared] matchController:@"/user/1/?tabIndex=3"];
NSLog(@"%@", viewController.params[@"tabIndex"]);
輸出:3
URL Schemes
如果你的app已經定義了一些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回調,如果感興趣的同學可以看下.h文件,使用方式和視圖跳轉是一樣的!
Block定義
[[HHRouter shared] map:@"block1" toBlock:^id(NSDictionary *params) {
NSLog(@"%@", params);
return @"test";
}];
因為返回值是id類型,所以,你可以返回數組,字典等等都可以!
調用有兩種方式:
第一種:
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
細心的同學看出來來了吧?
第一種調用方式會返回一個block可以往里面進行傳值。
第二種是直接調用無需進行傳值操作。
各位可以根據自己的業務需求來進行選擇。
安裝
CocoaPods
pod 'HHRouter', '~> 0.1.5'
手動
直接把GitHub里面的HHRouter.h和HHRouter.m文件引入到你的項目里面即可。
在你需要的ViewController里面import:
#import "HHRouter.h"
許可證:
HHRouter遵循MIT許可證