转自linfengwenyouapp
在运行过程当中更改根控制器的方法:(假设:A为当前根控制器,B为要设的根控制器).net
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];
事件以下:3d
- (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]; }
问题出来了:code
Attempt to present <SecondViewController: 0x7fad63e0b470> on <ViewController: 0x7fad63d28dd0> whose view is not in the window hierarchy!
我的分析:由于在没有present以前就已经走过这个方法了,若是在其中设置更改根控制器就会致使A不在window的层级中,没法presentViewController,过后使用会出现许多问题。blog
若是使用insertSubView便没有这个问题事件
- (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控制器已经没有用处了,怎样将其销毁rem
A.view = nil; // 这样就会直接去调用A的viewDidUnload 方法,将当前控制器销毁,并非当即去调用,而是要花点时间,就像是
能够建立多个window,在执行完成后能够设置其window为self.window,并让其成为key window,而后只要想使用的话就只能够将self.window赋值想要展现的window可此时销毁刚才的window,而后再将[self.window makeKeyandVisible];get