轉自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