URL原理在视图控制器间跳转的运用

 一、问题引入

一个视图控制器对应一个UI界面,那么UI界面的跳转,底层就得实现视图控制器的跳转。

那么当界面多,且界面跳转情况复杂时,需在视图控制器中添加业务逻辑,并且增加视图控制器之间的藕合度。在java中网页跳转有xml解决此问题,但是在iOS中,系统并没有提供解决方案。

二、认识URL

    NSString *urlString = @"http://weibo.com/p/100808a4b68909c606cae3953d196c16efa8bd?k=%E6%B5%B7%E5%8D%97%E9%A9%AC%E6%8B%89%E6%9D%BE";
    NSURL *url = [NSURL URLWithString:urlString];
    
    NSLog(@"url scheme : %@", [url scheme]); // 方案
    NSLog(@"url host : %@", [url host]); // 主机名
    NSLog(@"url port : %@", [url port]); // 端口号
    NSLog(@"url user : %@", [url user]); // 用户
    NSLog(@"url password : %@", [url password]); //密码
    NSLog(@"url path :%@", [url path]); // 路径
    NSLog(@"path componet : %@", [url pathComponents]); // path拆分成的数组
    NSLog(@"url fragment :%@", [url fragment]); // 片段
    NSLog(@"url parameterString : %@", [url parameterString]); // parameter
    NSLog(@"url query :%@", [url query]); // url中?后面部分
    NSLog(@"url relativePath :%@", [url relativePath]); // 就是path

运行结果:

2016-02-28 18:51:06.849 Test5[806:104259] url scheme : http

2016-02-28 18:51:06.850 Test5[806:104259] url host : weibo.com

2016-02-28 18:51:06.851 Test5[806:104259] url port : (null)

2016-02-28 18:51:06.851 Test5[806:104259] url user : (null)

2016-02-28 18:51:06.851 Test5[806:104259] url password : (null)

2016-02-28 18:51:06.851 Test5[806:104259] url path :/p/100808a4b68909c606cae3953d196c16efa8bd

2016-02-28 18:51:06.851 Test5[806:104259] path componet : (

    "/",

    p,

    100808a4b68909c606cae3953d196c16efa8bd

)

2016-02-28 18:51:06.852 Test5[806:104259] url fragment :(null)

2016-02-28 18:51:06.852 Test5[806:104259] url parameterString : (null)

2016-02-28 18:51:06.852 Test5[806:104259] url query :k=%E6%B5%B7%E5%8D%97%E9%A9%AC%E6%8B%89%E6%9D%BE

2016-02-28 18:51:06.852 Test5[806:104259] url relativePath :/p/100808a4b68909c606cae3953d196c16efa8bd

Program ended with exit code: 0

 

三、如何通过URL来解决视图控制器之间的跳转?

1、Creating viewController map。

可以通过key和NSString来映射一个UIViewController:[manager mapKey:@"aaa" toControllerClassName:@"UIViewController"];

可以通过key和NSString来映射一个实例:[manager mapKey:@"bbb" toControllerInstance:[[UIViewController alloc] init]];

甚至value可以用block实现

2、Getting viewController for key。当取出ViewController的时候, 如果有单例[ViewController sharedInstance], 默认返回单例, 如果没有, 返回[[ViewController alloc] init]。

3、通过[manager openURLString:urlString]实现跳转。

 

四、urlString规范

1、URL的scheme部分如果为modal,则表示呈现模态视图;

2、URL的scheme部分为window,则用host替换当前window.rootViewController;

3、URL的query部分,用来给新的UIViewController配置新的属性值,即VC之间传值实现;

4、URL为@"dismiss",代表关闭模态视图;

5、如果URL直接为key/key组成的path,那么就push到key所映射的UIViewController中。

 

参考第三方类库支持:https://github.com/uxyheaven/XYRouter

具体实现,请查看源代码。 

posted on 2016-02-29 01:40  Beche  阅读(373)  评论(0编辑  收藏  举报

导航