zoukankan      html  css  js  c++  java
  • [BS-20] 导航控制器和视图控制器在添加控制器的区别

    导航控制器和视图控制器在添加控制器的区别

    1.

    因导航控制器拥有导航栈,有一个普通视图控制器都没有的数组viewControllers,加入该数组中的视图控制器默认以push的方式进入导航栈。导航控制器有个[UINavigationController alloc] initWithRootViewController:rootVC]; 的初始化方法,调用该方法相当于把rootVC加入数组viewControllers的第一个位置,作为栈底部的rootVC是不会被pop出去的,与导航控制器共生死。加入导航栈的VC,在被push到栈顶时,VC.view会被创建/装载,并显示在window上,并不是将栈顶的VC.view加到下一层VC.view上,此时下一层VC.view已经不在UI层级中了。

    2.

    所有的视图控制器都有一个[viewController addChildViewControllerl:vc]的方法,使用该方法加入的vc,会自动存储在viewController的childViewControllers数组中(类似UIView的subViews数组)。

    注意:只能通过addChildViewController的方法给childViewControllers数组增加元素,不能直接对其进行赋值,因为childViewControllers数组对程序员来说是只读的。

    另外:viewController.childViewControllers中的所有vc仅仅表示是viewController的子控制器。子控制器的view不会自动加载到viewController.view上去,需要手动将子控制器view加到父视图控制器view或者view的任意子view上,才能显示在屏幕上。

     3.

    因导航控制器又属于视图控制器,所以导航控制器也可以通过[navC addChildViewController:vc]; 给自己的childViewControllers数组添加子视图控制器,但是此方法增加的VC会被自动加入导航栈数组viewControllers中去。在某VC出现在栈顶时,它的view会被自动装载。

    所以对于导航控制器viewControllers和childViewControllers中的内容是一模一样的,不同的是childViewControllers是只读的,而viewControllers是NSArray不可变数组,可以给它赋初始值。

    4.

    注意区别:

    self.childViewControllers,

    self.presentedViewController,

    self.presentingViewController,

    self.presentingViewController.childViewControllers,

    self.navigationController.viewControllers,

    self.navigationController.childViewControllers,

    self.navigationController.viewControllers[0].childViewControllers

     5.

    初始化navigationController的三种方法:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        _window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
        _window.backgroundColor = [UIColor whiteColor];
        
        
        WZEssenceViewController *essenceVC = [WZEssenceViewController new];
        WZNewViewController *newVC = [WZNewViewController new];
        WZFriendViewController *friendVC = [WZFriendViewController new];
        WZMeViewController *meVC = [WZMeViewController new];
        
        //方法一
    //    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:essenceVC];
    //    [essenceVC.navigationController pushViewController:newVC animated:YES];
    
        
        //方法二
        UINavigationController *nav = [[UINavigationController alloc]init];
        nav.viewControllers = @[essenceVC, newVC, friendVC, meVC]; //默认以push的方式进入导航站
        //nav.childViewControllers = @[essenceVC, newVC, friendVC, meVC]; //是只读的,不能赋值
        NSLog(@"nav.viewControllers:%@ 
     nav.childViewControllers:%@ ",nav.viewControllers,nav.childViewControllers);
    
    //    //方法三
    //    UINavigationController *nav = [[UINavigationController alloc]init];
    //    [nav addChildViewController:essenceVC];
    //    [essenceVC.navigationController pushViewController:newVC animated:YES];
     
        
        _window.rootViewController = nav;
        
        [_window makeKeyAndVisible];
        
        
        return YES;
    }
    
    
    打印结果如下:
    2016-05-16 19:11:24.784 
    nav.viewControllers:(
        "<WZEssenceViewController: 0x7d178d00>",
        "<WZNewViewController: 0x7d179a20>",
        "<WZFriendViewController: 0x7d17a160>",
        "<WZMeViewController: 0x7d17a7f0>"
    ) 
     nav.childViewControllers:(
        "<WZEssenceViewController: 0x7d178d00>",
        "<WZNewViewController: 0x7d179a20>",
        "<WZFriendViewController: 0x7d17a160>",
        "<WZMeViewController: 0x7d17a7f0>"
    ) 

     6.

    导航控制器作为window根视图,然后将4个视图控制器push进入导航栈,具体的UI层级调试如下:

    2016-05-17 10:13:19.916  navC.viewControllers数组中:

     vc:<WZEssenceViewController: 0x7b6ca7f0>, 

     vc.view:<UIView: 0x7cc3f9b0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x7cc45670>>

     

     vc:<WZNewViewController: 0x7c94c790>, 

     vc.view:<UIView: 0x7cc579d0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x7cc58050>>

     

     vc:<WZFriendViewController: 0x7c949310>, 

     vc.view:<UIView: 0x7cc595d0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x7cc56700>>

     

     vc:<WZMeViewController: 0x7b7463b0>, 

     vc.view:<UIView: 0x7cc974d0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x7cc97590>>

     

    文章原创,转载请注明出处:http://www.cnblogs.com/stevenwuzheng/p/5499327.html

    如有错误,欢迎随时指正!

     

     

  • 相关阅读:
    iscsi: 多路径
    Paxos算法分析
    ceph实践: 搭建环境
    ocfs2: 搭建环境
    设计模式:Context模式
    Ceph剖析:Leader选举
    Ceph剖析:定时器safetimer的实现
    nfs:环境搭建
    Ceph剖析:数据分布之CRUSH算法与一致性Hash
    Linux命令小结:crontab/netstat/iostat/sar
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5499327.html
Copyright © 2011-2022 走看看