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

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

时间: 2024-12-31 05:45:33

URL原理在视图控制器间跳转的运用的相关文章

IOS 在控制器间跳转实现过渡动画

已经掌握了CALayer下的CATransition动画在同一个控制器下实现,但是在不同控制器间跳转又该如何实现呢? MyViewController *myVC = [[MyViewController alloc]init]; //创建动画 CATransition *animation = [CATransition animation]; //设置运动轨迹的速度 animation.timingFunction = UIViewAnimationCurveEaseInOut; //设置动

UI 设置代理 实现视图控制器间的传值操作

如果当前有两个视图控制器 MainViewController 和 SecondViewController 实现让SecondViewController 传值给 MainViewController  : 1. 首先在 SecondViewController.h // 1. 协议传值 // 协议由后面的视图控制器制定 @protocol SecondDelegate <NSObject> // 传值协议的方法需要带一个或多个参数 - (void) passValueWithString:

Snail—UI学习之导航视图控制器UINavigationController(系统)

背景 有一个根视图控制器 然后跳转到第一个界面  第一个界面可以返回到根视图 也可以跳转到第二个视图 第二个视图可以直接返回到根视图 新建三个ViewController    RootViewController FirstViewController SecondViewController 首先在AppDelegate.m中写入 #import "WJJAppDelegate.h" #import "WJJRootViewController.h" @impl

iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有两种方法. 1.通过方法 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳转 相

iOS-UIViewController视图控制器跳转界面的几种常用方法

一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有两种方法. 1.通过方法 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳转 相

UI 03 UIViewController (视图控制器)的7个方法与视图的跳转

新建一个继承于UIViewController 的类 在AppDelegate.m 中写如下代码. //1.创建一个rootViewController对象 RootViewController *rootVC = [[RootViewController alloc]init]; //2.给window设置根视图控制器 self.window.rootViewController = rootVC; [rootVC release]; 在RootViewController.m文件中的代码如下

IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtton点击监控事件方法-(void)event{};视图的跳转就在这个方法中实现(注意:这个button不在视图控制器里面,就算导了相关头文件,也不能跳转,所以只能通过代理方法,或者代码块等,在这个button(在自定义控件空,非视图控制器)方法中调用相关方法,在视图控制器中去实现) 代理实现方法: 在

UI - 视图控制器跳转另一个视图控制器特效总结

1. 从一个视图控制器跳转另一个视图控制器的方式是可以进行设置的 CATransition *animation = [[CATransition alloc]init]; animation.duration = 1; animation.type = @"pageCurl";  //立方体翻滚效果 animation.subtype = @"fromBottom";  //从底部开始 [self.view.window.layer addAnimation:an

TextField跳转视图控制器

1,设置输入框的Enable属性为YES,关闭其他traits属性,保证点击textfield的时候不会弹出输入框 2,textfield设置成属性,viewdidload里设置代理,遵循<UITextFieldDelegate>协议 3,调用-(BOOL)textFieldShouldBeginEditing:方法,在里面进行跳转 注意:跳转方法尽量使用 SearchViewController *search1 = [self.storyboard instantiateViewContr