一、问题引入
一个视图控制器对应一个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
具体实现,请查看源代码。