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 , 以栈的方式管理所 控制的视图控制器 . 至少要有一个被管理的视图控制器 ,这个控制器我们称作导航控制器的根视 ...
随机推荐
- HDU2093 字符串2种不错的读入思路
<span style="font-family: 'Times New Roman'; font-size: 12px; background-color: rgb(255, 255 ...
- android实现透明和半透明效果
从透明到半透明时一个值的变化过程. #00000000(全透明)——#e0000000(半透明) 如果觉得半透明的效果太暗淡.可以设置成#60000000,#80000000,#a0000000等等
- angular $location常用方法使用
$location提供了一些常用的操作和获取地址栏里的地址的方法. <script type="text/javascript"> angular.module('ap ...
- ASP.NET中分布式事务的使用
之前发表了一篇事务的存储过程,最近在做项目的时候遇到分布式事务,所有总结一下,跟大家分享和交流一下经验.首先说明为什么要分布式事务呢?先说说我在项目的哪里遇到分布式事务吧,我是在做网站后台开发的时候, ...
- 【IOS学习基础】weak和strong、懒加载、循环引用
一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成 ...
- Windows Server 2008 R2 IIS重装
背景描述: 在一个刚睡醒午觉后的下午,忽然收到客户反馈,说昨天开始应用特别卡,各种卡各种不好用,忽然想到上次说要优化服务器IIS配置还一直没弄,然后迷迷糊糊的就开始进行客户现场服务器IIS配置优化,涉 ...
- RTMP流媒体播放过程(转)
http://blog.csdn.net/leixiaohua1020/article/details/11704355 本文描述了从打开一个RTMP流媒体到视音频数据开始播放的全过程. 注意:RTM ...
- 对获取config文件的appSettings节点简单封装
转:http://www.cnblogs.com/marvin/archive/2011/07/29/EfficiencyAppSetting.html C#的开发中,无论你是winform开发还是w ...
- ubuntu中vim找不到配色方案blackboard
在ubuntu下启动vim,提示找不到配色方案blackboard(或其他的), 如何挑选自己喜欢的配色方案呢?在/usr/share/vim/vim72/colors中,(这里根据自己的vim版本选 ...
- Print! Print! Print!
print语句可以实现打印--只是对程序员友好的标准输出流的接口而已. 从技术角度来讲,这是把一个或多个对象转换为其文本表达形式,然后发送给标准输出或另一个类似文件的流. 更详细地说,在Python中 ...