iOS 路由管理页面跳转
简单直接,本文实现是基于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里获取到这个key
type
对应的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
好了,言归正传,在我的项目里,对路由的使用就是这么简单,上面的栗子也都很简单,可能由于马上要回家过年了,思路有点乱,有些地方可能会看不懂,没关系,给我留言(
大神绕路就好了
),我会一一回复,最后祝大家新年快乐,阖家幸福。