iOS切换window根控制器 (转)
在运行过程中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器)
方法一:
1. appdelegate.m中
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
A *vc = [[A alloc] init]; // init会执行viewDidLoad viewWillAppear
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
2. A.m中添加设置,比如一个按钮跳转到B并在B中设置B为根控制器
事件如下:
- (void)btnClick:(UIButton *)sender {
B *second = [[B alloc] init];
second.view.backgroundColor = [UIColor blueColor];
[self presentViewController:second animated:YES completion:nil];
// [self.view.window insertSubview:second.view aboveSubview:self.view];
}
3. 注意点出来了,如果使用的是presentViewController则在设置B为根控制器的方法就必须在viewDidLoad与viewWillAppear之后进行设置。不然如下
问题出来了:
Attempt to present <SecondViewController: 0x7fad63e0b470> on <ViewController: 0x7fad63d28dd0> whose view is not in the window hierarchy!
个人分析:因为在没有present之前就已经走过这个方法了,如果在其中设置更改根控制器就会导致A不在window的层级中,无法presentViewController,事后使用会出现许多问题。
如果使用insertSubView便没有这个问题
4. B中更改根控制器:(建议在控制器已经完全在window上展示再切换window的根控制器)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
AppDelegate *app = [UIApplication sharedApplication].delegate; // 获取当前app单例
NSLog(@"appdelegate is %@",app);
UIViewController *vc = app.window.rootViewController;
app.window.rootViewController = self;
[vc removeFromParentViewController];
NSLog(@"当前的根控制器为:%@",self.view.window.rootViewController);
}
遗留问题:A控制器已经没有用处了,怎样将其销毁
A.view = nil; // 这样就会直接去调用A的viewDidUnload 方法,将当前控制器销毁,并不是立即去调用,而是要花点时间,就像是
方法二:(提供个基本思路,实际情况大家研究下了)
可以创建多个window,在执行完成后可以设置其window为self.window,并让其成为key window,然后只要想使用的话就只可以将self.window赋值想要展示的window可此时销毁刚才的window,然后再将[self.window makeKeyandVisible];
iOS切换window根控制器 (转)的更多相关文章
- iOS - 切换rootViewController时,销毁之前的控制器
一.iOS在切换根控制器时,如何销毁之前的控制器?(切换rootViewController时注意的内存泄漏) 首先.在iOS的ARC机制下,任何对象,当没有其他对象对他进行强引用时,都会被自动释放. ...
- 切换根控制器UIApplication 主屏幕UIScreen 读取文件资源NSBundle
//主屏幕设为webView CGRect frame = [UIScreen mainScreen].applicationFrame; UIWebView *webView = [[[UIWebV ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- IOS初级:导航控制器
1.AppDelegate.m老生常谈了,创建window,创建根视图rootViewController - (BOOL)application:(UIApplication *)applicati ...
- iOS开发UI篇—控制器的创建
iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...
- iOS开发UI篇—控制器的View的创建
iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 #import "NJAppDelegate.h" #import "NJViewContro ...
- iOS利用Runtime自定义控制器POP手势动画
前言 苹果在iOS 7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操 ...
- IOS笔记046-UIApplication/导航控制器
UIApplication 每一个应用都有自己的UIApplication对象,而且是单例的 通过[UIApplication sharedApplication]可以获得这个单例对象 一个iOS程序 ...
- iOS开发 — (UINaVigationController)导航控制器,界面传值
UINavigationController 继承于 UIViewController , 以栈的方式管理所 控制的视图控制器 . 至少要有一个被管理的视图控制器 ,这个控制器我们称作导航控制器的根视 ...
随机推荐
- 使用Unicorn-engine 续1
续上次,在ubuntu server 14.04交叉编译好后,下一步就是在windows上使用了. 在windows上,我主要是用python进行分析程序,因此我最初安装的是官网上的 unicorn- ...
- 【高精度+DP】【HDU1223】 OrderCount
Order Count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- MVC之MVCSQO方法查询、排序、分页、投影
- SqlLikeAttribute 特性增加 左、右Like实现
SqlLikeAttribute 特性原来只实现了全Like,今天增加左.右Like实现 更新时间:2016-04-30 /// <summary> /// 获取查询条件语句 /// &l ...
- <转>让SVN用户能够修改自身密码的PHP页面
1.修改Apache配置文件因为我在安装和配置SVN的时候,对Apache的配置文件进行过优化,将所有关于SVN的配置都写在了/opt/apache2/conf/extra/httpd-svn.con ...
- HDU 1070 - Milk
给每种牛奶价格和量 要求买最便宜的牛奶 #include <iostream> using namespace std; int t,n; ][]; ],v[]; int main() { ...
- MYSQL SET类型字段的SQL查询某个字段保函某个值的查询
1.column set('hot','crazy','smart') //column字段(set属性)三个值 2.select * from table where FIND_IN_SET('h ...
- .Net Service部署(二)
1. 以管理员权限运行cmd.exe2. 安装服务 安装服务需要注意的是,如果电脑已经安装了此服务,需要先停止服务然后删除服务, 在进行安装注册,注册前先运行 cd C:\Windows\Micro ...
- jq插件第二款来袭 图片滚动
这第二款也是非常实用的插件,也是与图片相关,关于图片的需求太多了,这个是图片滚动哦,不过不是无缝滚动,是左像右滚动,到头的话再往回滚动,利用scrollLeft实现的,支持自动滚动和每次滚动的个数默认 ...
- windows 文件watch nodejs
本篇博客,主要是记录下最近一直纠结的gulp.watch方法,在工作中我们肯定都遇到过,新添加的文件没办法自动触发watch,下面我们就来看有什么办法处理 1.首先我们肯定是先百度一下 百度推荐的是g ...