zoukankan      html  css  js  c++  java
  • iOS切换window根控制器 (转)

    转自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];

    追寻最真
  • 相关阅读:
    正向代理和反向代理
    Unicode
    utf-8
    ISO 8895-1
    ProtocalBuffers学习记录
    C#基础知识
    MSBuild学习记录
    Linux学习笔记
    Jenkins学习记录
    CruiseControl.Net学习记录
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/6001444.html
Copyright © 2011-2022 走看看