iOS 路由管理页面跳转

2020-01-20  本文已影响0人  邓布利多教授

简单直接,本文实现是基于MGJRouter,为什么是基于MGJRouter,因为简单,就这么随意。

1、创建管理路径的类


#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/// 页面路径
static NSString *MESSAGE            = @"MessageController";

@interface LYRouterManager : NSObject

/// 跳转页面
/// @param url 页面路径
/// @param paramInfo 传递的参数,需要注意的是key值的添加和获取要对应
+(void)openUrl:(NSString *)url ParamInfo:(NSDictionary *)paramInfo;

@end

NS_ASSUME_NONNULL_END
#import "LYRouterManager.h"
#import <MGJRouter/MGJRouter.h>

#import "MessageController.h"

@implementation LYRouterManager

+(void)openUrl:(NSString *)url ParamInfo:(NSDictionary *)paramInfo{
    
    //为每个跳转添加登录判断的字段,默认需要登录
    NSMutableDictionary *mutDict = [NSMutableDictionary dictionaryWithDictionary:paramInfo];
    [mutDict setObject:@(YES) forKey:@"login"];
    [MGJRouter openURL:url withUserInfo:mutDict completion:nil];
    
}

// 在load方法中自动注册,在主工程中不用写任何代码。
+ (void)load {
    
    //消息
    [LYRouterManager messageCWithUrl:MESSAGE];
    
}

+(void)pushControllerWithSuperView:(NSString *)superView Param:(NSDictionary *)param{
    
    UIViewController *selfNav = param[MGJRouterParameterUserInfo][@"superView"];
    EmptyController *vc = [NSClassFromString(superView) new];
    vc.paramDict = param[MGJRouterParameterUserInfo];
    vc.hidesBottomBarWhenPushed = YES;
    [selfNav.navigationController pushViewController:vc animated:YES];
    
}

//参数修改
+(NSDictionary *)isNeedLoginWithBol:(BOOL)isBol Param:(NSDictionary *)param{
    
    //不可变字典转化成可变字典
    NSMutableDictionary *mutSuper = [NSMutableDictionary dictionaryWithDictionary:param];
    
    //获取需要修改的key
    NSMutableDictionary *mutSub = [NSMutableDictionary dictionaryWithDictionary:mutSuper[MGJRouterParameterUserInfo]];
    [mutSub setObject:@(isBol) forKey:@"login"];
    
    //修改完成重新添加回源数据中
    [mutSuper setObject:mutSub forKey:MGJRouterParameterUserInfo];
    
    return mutSuper;
    
}

//判断是否需要登录
+(void)gotoLoginWithSuperView:(NSString *)superView Param:(NSDictionary *)param{
    
    //判断是否需要登录
    if ([param[MGJRouterParameterUserInfo][@"login"] boolValue]) {
        
        //如果需要登录,判断缓存用户id是否存在,如果存在就不需要登录,否则跳到登录页面
        if (!LYGET_CACHE(LYUserID)) {
            [LYRouterManager pushControllerWithSuperView:LOGIN Param:param];
        }else{
            [LYRouterManager pushControllerWithSuperView:superView Param:param];
        }
        
    }else{
        [LYRouterManager pushControllerWithSuperView:superView Param:param];
    }
    
}

#pragma mark - ******       华丽的分割线       ******

//消息
+(void)messageCWithUrl:(NSString *)messageC{
    [MGJRouter registerURLPattern:messageC toHandler:^(NSDictionary *routerParameters) {
        [self gotoLoginWithSuperView:messageC Param:routerParameters];
        //如果不需要登录,在这里修改login对应的value
//        [self gotoLoginWithSuperView:messageC Param:[self isNeedLoginWithBol:NO Param:routerParameters]];
    }];
}

2、创建Controller基类


#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface EmptyController : UIViewController

@property (nonatomic, strong) NSDictionary *paramDict;

@end

NS_ASSUME_NONNULL_END
#import "EmptyController.h"

@interface EmptyController ()

@end

@implementation EmptyController

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.navigationController.navigationBar.hidden = YES;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

@end

3、实际应用

[LYRouterManager openUrl:MESSAGE ParamInfo:@{@"superView":self}];

那为啥要传一个@{@"superView":self}呢?因为需要知道是从哪里开始跳转,还有一个硬伤是,要获取到导航栏才能跳转,因为我所有的页面跳转,全都是push的。
那么好,到这里为止,简单的页面跳转,就可以通过这个路由实现了,这样的好处是啥呢?是~不需要在每个Controller里添加各种需要跳转的头文件,只需要在管理路径的类引入一次需要跳转的头文件就ok了。就只有这一个好处吗?当然不是,第二步我创建了一个Controller基类,那么怎么用呢,就是页面之间传值的时候用的,创建这个基类也有一个好处,就是我各个页面传值的时候,不需要在每个Controller的.h文件创建各种属性了,直接在ParamInfo后面的参数集合中添加对应的key和value就好,看下代码怎么写的吧。

[LYRouterManager openUrl:MESSAGE ParamInfo:@{@"superView":self, @"type":@"123"}];
self.paramDict[@"type"]

easy不?爽不?看下Controller的.h文件,毛都没有,清爽吧?那么.h文件是不是就失去了它存在的价值呢?可以删掉了吧?呵呵……你删一下试试看!
住手!!!把手放下!!!说着说着就要动手干架!你这人性格肯定有问题,人格分裂吧你?
我可没说.h文件没有用了,不管.h文件里面有没有东西,它!都!不!能!删!
接下来,可能心思缜密的人会说了,那我要做回调怎么用这个路由实现呢?GOOD!!!YOU GET IT!!!

[LYRouterManager openUrl:ABCD
               ParamInfo:@{@"superView":self,
                           @"block":^{
    NSLog(@"111");
}}];
.h文件
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

typedef void(^ DissReloadBlock)(void);

@interface ABCD : EmptyController

@property (nonatomic, copy) DissReloadBlock block;

@end

NS_ASSUME_NONNULL_END
.m文件
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //成功后回调刷新页面
    self.block = self.paramDict[@"block"];
    if (self.block) {
        self.block();
    }
    
}

惊喜不?意外不?哎(往上拔的高亢的二声调)~

END

好了,言归正传,在我的项目里,对路由的使用就是这么简单,上面的栗子也都很简单,可能由于马上要回家过年了,思路有点乱,有些地方可能会看不懂,没关系,给我留言(大神绕路就好了),我会一一回复,最后祝大家新年快乐,阖家幸福。

上一篇下一篇

猜你喜欢

热点阅读