转自linfengwenyou

在运行过程中更改根控制器的方法:(假设: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根控制器 (转)的更多相关文章

  1. iOS - 切换rootViewController时,销毁之前的控制器

    一.iOS在切换根控制器时,如何销毁之前的控制器?(切换rootViewController时注意的内存泄漏) 首先.在iOS的ARC机制下,任何对象,当没有其他对象对他进行强引用时,都会被自动释放. ...

  2. 切换根控制器UIApplication 主屏幕UIScreen 读取文件资源NSBundle

    //主屏幕设为webView CGRect frame = [UIScreen mainScreen].applicationFrame; UIWebView *webView = [[[UIWebV ...

  3. iOS开发中视图控制器ViewControllers之间的数据传递

    iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...

  4. IOS初级:导航控制器

    1.AppDelegate.m老生常谈了,创建window,创建根视图rootViewController - (BOOL)application:(UIApplication *)applicati ...

  5. iOS开发UI篇—控制器的创建

    iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...

  6. iOS开发UI篇—控制器的View的创建

    iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 #import "NJAppDelegate.h" #import "NJViewContro ...

  7. iOS利用Runtime自定义控制器POP手势动画

    前言 苹果在iOS 7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操 ...

  8. IOS笔记046-UIApplication/导航控制器

    UIApplication 每一个应用都有自己的UIApplication对象,而且是单例的 通过[UIApplication sharedApplication]可以获得这个单例对象 一个iOS程序 ...

  9. iOS开发 — (UINaVigationController)导航控制器,界面传值

    UINavigationController 继承于 UIViewController , 以栈的方式管理所 控制的视图控制器 . 至少要有一个被管理的视图控制器 ,这个控制器我们称作导航控制器的根视 ...

随机推荐

  1. Intersection of Two Linked Lists(java)

    eg: a1 → a2 ↘ c1 → c2 → c3 或者直接a1 → b1 ↗ b1 → b2 → b3求公共链表c1. 常规的指针分裂法,复制法,偏移法. public class Solutio ...

  2. Oracle运维必修内功:前瞻性运维理念

    数据库是商业的灵魂和大脑,作为核心IT业务模块,数据库的重要性毋庸置疑.管理数据库在做好系统前期部署后,在系统持续运行中,需要时刻关注系统自身和环境等对于运行可能产生的潜在影响和可能的危险,并及时予以 ...

  3. win7系统64位plsql的设置

    1. Instant Client Downloads for Microsoft Windows (32-bit) 我下载的是: instantclient-basic-win32-11.2.0.1 ...

  4. ios 75个工具

    如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务.   软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具 ...

  5. 新浪微博iOS示例,登录,获取个人信息

    1.导入第三方库和系统框架

  6. [Linked List]Convert Sorted List to Binary Search Tree

    Total Accepted: 57775 Total Submissions: 198972 Difficulty: Medium Given a singly linked list where ...

  7. Java开发23中设计模式

    设计模式(Design Patterns) 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结.使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性.毫无疑问 ...

  8. logfile提示stale错误解决方法

    产生该错误的原因解释如下: Explanation: ============ A stale redo log file is one that Oracle believes might be i ...

  9. Asp.net SignalR 初试和应用笔记一 认识和使用 SignalR

    如果你在用QQ,微信.你会知道,广告和消息无处不在.也有好的一面,比如通过QQ或微信,微博等及时聊天功能,你找到了你的初恋,你找到了小学的班级等等. 这里的及时通信在很多应用场所能用到,比如: 1.球 ...

  10. Android小记之--ClickableSpan

    在给TextView设置超链接时,要想ClickableSpan的onClick事件响应,还必须同时设置tv.setMovementMethod(LinkMovementMethod.getInsta ...