[iOS]コンポーネント化の1つ:MGJRouterのシンプルで実用的

3778 ワード

大規模なAPP開発プロセスではiOSのコンポーネント化に関する技術が使用されますが、ルーティングはコンポーネント化の核心ではありませんが、大規模で複雑なシステムを構築する基礎です.
現在、国内のキノコ街チームはMGJRouterルーティングライブラリを提供しており、使用は比較的簡単で、その原理は主にURLを登録することによってルーティングジャンプを実現することである.主に2つのステップがあります.
1、登録URL生成ルーティングテーブル、2.OpenUrlはジャンプを実現します.
次はdemoを簡単に使用します.
一、クラスRouterManagerを作成し、+(void)loadメソッドにurlを統一的に登録します.
#import 

@interface RouterManager : NSObject

@end
#import "RouterManager.h"
#import "MGJRouter.h"
#import "TestViewController.h"
#import "Test2ViewController.h"
#import "Test3ViewController.h"
@implementation RouterManager

+ (void)load {
    [MGJRouter registerURLPattern:@"MGJ://Test1/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
        UINavigationController *navigationController = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
        TestViewController *testVC = [[TestViewController alloc] init];
        [navigationController pushViewController:testVC animated:YES];
    }];
    
    [MGJRouter registerURLPattern:@"MGJ://Test2/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
        UINavigationController *navigationControler = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
        NSString *labelText = routerParameters[MGJRouterParameterUserInfo][@"text"];
        Test2ViewController *test2 = [[Test2ViewController alloc] init];
        test2.labelText = labelText;
        [navigationControler pushViewController:test2 animated:YES];
        
    }];
    
    [MGJRouter registerURLPattern:@"MGJ://Test3/PushMainVC" toHandler:^(NSDictionary *routerParameters) {
        UINavigationController *navigationControler = routerParameters[MGJRouterParameterUserInfo][@"navigationVC"];
        
        void(^block)(NSString *) = routerParameters[MGJRouterParameterUserInfo][@"block"];
        Test3ViewController *test3 = [[Test3ViewController alloc] init];
        test3.btnClickBlock = block;
        [navigationControler pushViewController:test3 animated:YES];
    }];
    
    [MGJRouter registerURLPattern:@"MGJ://Test2/getMainVC" toObjectHandler:^id(NSDictionary *routerParameters) {
        NSString *labelText = routerParameters[MGJRouterParameterUserInfo][@"text"];
        Test2ViewController *vc = [[Test2ViewController alloc] init];
        vc.labelText = labelText;
        return vc;
    }];
}

@end

二、呼び出し:
#import "ViewController.h"
#import "MGJRouter.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)pushVC:(id)sender {
    
    [MGJRouter openURL:@"LXY://Test1/PushMainVC" withUserInfo:@{@"navigationVC":self.navigationController} completion:nil];
}

- (IBAction)passNextClick:(id)sender {
    [MGJRouter openURL:@"MGJ://Test2/PushMainVC" withUserInfo:@{@"navigationVC":self.navigationController,@"text":@" "} completion:nil];
}
- (IBAction)blockBtnClick:(id)sender {
    [MGJRouter openURL:@"MGJ://Test3/PushMainVC" withUserInfo:@{@"navigationVC":self.navigationController,
                       @"block":^(NSString *text){
                            NSLog(@"%@",text);
                      }} completion:nil];
}
- (IBAction)backClick:(id)sender {
    [self.navigationController pushViewController:[MGJRouter objectForURL:@"MGJ://Test2/getMainVC" withUserInfo:@{@"text":@"dsfdsf"}] animated:YES];
}

注意:2番目のボタンはジャンプした後に同時に次のVCに値を伝え、3番目のボタンはジャンプした後に値をコールバックします.