美文网首页
iOS 路由管理页面跳转

iOS 路由管理页面跳转

作者: 邓布利多教授 | 来源:发表于2020-01-20 10:29 被阅读0次

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

    1、创建管理路径的类

    • 引入MGJRouter的头文件#import <MGJRouter/MGJRouter.h>

    • 推荐一下,管理第三方库使用Pod,方便快捷,麻烦少,引流(使用经验点这里)


    • .h文件
    #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
    
    • .m文件
    #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基类

    • 所有ViewController创建的时候全都基于这个基类,别问为啥,等会告诉你

    • .h文件
    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface EmptyController : UIViewController
    
    @property (nonatomic, strong) NSDictionary *paramDict;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    • .m文件
    #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、实际应用

    • 只需要在页面跳转的位置写一句话就ok
    [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"}];
    
    • 那么怎么在Controller里获取到这个keytype对应的value呢?代码如下:
    self.paramDict[@"type"]
    

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

    • 直接上栗子,假如现在要跳转到ABCD这个Controller去,并且有一个回调block,可以如下方式写:
    [LYRouterManager openUrl:ABCD
                   ParamInfo:@{@"superView":self,
                               @"block":^{
        NSLog(@"111");
    }}];
    
    • ABCD的.h文件和.m文件怎么写呢?如下:
    .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

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

    相关文章

      网友评论

          本文标题:iOS 路由管理页面跳转

          本文链接:https://www.haomeiwen.com/subject/ltbczctx.html