iOS切換window根控制器 (轉)

轉自linfengwenyouapp

在運行過程當中更改根控制器的方法:(假設:A爲當前根控制器,B爲要設的根控制器).net

方法一:

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爲根控制器

事件以下: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];  
    }

3. 注意點出來了,若是使用的是presentViewController則在設置B爲根控制器的方法就必須在viewDidLoad與viewWillAppear以後進行設置。否則以下

問題出來了:code

Attempt to present <SecondViewController: 0x7fad63e0b470> on <ViewController: 0x7fad63d28dd0> whose view is not in the window hierarchy!

我的分析:由於在沒有present以前就已經走過這個方法了,若是在其中設置更改根控制器就會致使A不在window的層級中,沒法presentViewController,過後使用會出現許多問題。blog

若是使用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控制器已經沒有用處了,怎樣將其銷燬rem

A.view = nil; // 這樣就會直接去調用A的viewDidUnload 方法,將當前控制器銷燬,並非當即去調用,而是要花點時間,就像是

方法二:(提供個基本思路,實際狀況你們研究下了)

能夠建立多個window,在執行完成後能夠設置其window爲self.window,並讓其成爲key window,而後只要想使用的話就只能夠將self.window賦值想要展現的window可此時銷燬剛纔的window,而後再將[self.window makeKeyandVisible];get

相關文章
相關標籤/搜索