IOS开发中的页面跳转
不止在移动开发领域,甚至对于所有的前端开发,页面跳转都是最基本的场景转换,是开发过程 中最基本的问题。对于IOS初学者,push与present是两种最常用的方式,在开发的逐渐深入过程 中,需要接触到APN的推送、网络链接等等急于URLScheme的高级跳转方式,随着开发经验的不断 丰富,将APP中的跳转统一使用URLScheme来管理不失为一种良好的设计。
Push与Present
Push与Present是最基本的两种转场方式,也是URLScheme等高级封装的基础。两者最直观的区别 就是push的转场效果是自右向左的,其需要UINavigationController的配合使用,present模态 窗口的默认转场效果是自下而上的,两种的使用方式也有着本质区别。
UIViewController *nextViewController = [[UIViewController alloc] init];
nextViewController.title = @"第二个界面";
[self.navigationController pushViewController:nextViewController animated:YES];
UIViewController *nextViewController = [[UIViewController alloc] init];
nextViewController.title = @"第二个界面";
[self presentViewController:nextViewContrller animated:YES completed:nil];
Present方式经常被是用来进行字段的填充或者编辑页面,Present方式是默认没有NavigationBar 的,如果需要可以在外面包裹一层UINavigationViewController,如下:
[self presentViewController:[[UINavigationController alloc]
initWithRootViewController:controller] animated:YES completion:^{
}];
URLScheme
我们在开发过程中,会遇到四种与跳转相关的场景,分别是:
外部网页场景
只能通过AppDelegate中事件去获取对应的URL进行匹配。
Push推送场景
通过AppDelegate中的事件去获取数据,取出链接字段,然后自定义一个URL,就可以实现 跳转了。
内部网页场景
UIWebView在内部打开URL,如果要在网页中跳转APP页面,有两种方法:一种是使用JSBridge, js调用native的handler,跳到相关页面;二是直接使用url来跳转,原理同情景一。
应用内点击跳转
最普通的打开方式,也同样可以抽离一个URLScheme匹配器去匹配打开。
上面总结了四种场景,如果对于新手来说,可能会每一种场景写一遍跳转代码,这样即低效又 难以维护,高手会选择将这四种场景尽量融合为一种URLScheme,然后使用URL匹配器统一打开。
由于URLScheme的多功能性,需要给URLScheme定义一个类:
@interface MYURLObject : NSObject
@property MYURLType type;
NSDictionary *params;
@end
当然还需要一个Route类,该类最好能同时处理MYURLObject和urlString,其API如下:
+ (void)navigateWithURLObject:(LNURLObject *)obj;
+ (void)navigateToURL:(NSString *)url fromViewController:(UIViewController *)controller;
由于前面所说的前三个场景均是需要使用urlString来跳转,所以需要一个将urlString转化为 MYURLObject的类,其API为:
+ (MYURLObject *)convertToURLObject:(NSString *)url;
这样一个URL匹配器就搭建完成了,在写跳转代码的时候,请优先考虑URLScheme。