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

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:%@ \n 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;
} 打印结果如下:
-- ::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

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

 

 

[BS-20] 导航控制器和视图控制器在添加控制器的区别的更多相关文章

  1. 【Asp.Net Core】二、添加控制器和视图

    控制器Controller 在添加控制器前,我们先看下它为我们自动生成的一些Controller,我们看下AccountController.cs 来看下登录验证方法Login async这个应该是异 ...

  2. ASP.NET MVC4 新手入门教程之二 ---2.添加控制器

    MVC 代表 模型-视图-控制器.MVC 是一个模式用于开发应用程序是很好的架构. 可检验性和易于维护.基于 MVC 的应用程序包含: Models: 类表示应用程序的数据并使用验证逻辑以执行这些数据 ...

  3. ASP.NET MVC系列:添加控制器

    基于MVC的应用程序包含三个部分 Models(模型):对应用程序的数据进行处理 Views(视图):动态生成HTML,显示数据 Controllers(控制器):应用程序中处理用户交互的部分,处理浏 ...

  4. 学习方法和阶段介绍 、 iOS界面开发引入 、 构造第一个App 、 视图控制器和视图 、 控件与事件 、 InterfaceBuilder

    1 创建并运行第一个App 1.1 问题 使用Xcode创建一个App项目,该应用实现功能在界面上显示Hello World标签,在模拟器中的运行结果如图-1所示: 图-1 1.2 方案 分析图-1, ...

  5. iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期

    一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...

  6. Cocoa编程中视图控制器与视图类详解

    iPhone编程规则是:一个窗口,多个视图.UIView是iPhone屏幕上很多控件的基础类.每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView ...

  7. ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告

    ##DAY3 自定义视图.视图控制器.视图控制器指定视图.loadView. viewDidLoad.MVC.屏幕旋转.内存警告 #pragma mark ———————自定义视图的步骤 —————— ...

  8. ASP.NET MVC5(二):控制器、视图与模型

    前言 本篇博文主要介绍ASP.NET MVC中的三个核心元素:控制器.视图与模型,以下思维导图描述了本文的主要内容. 控制器 控制器简介 在介绍控制器之前,简单的介绍一下MVC工作原理:URL告知路由 ...

  9. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

随机推荐

  1. Asp反向代理程序,调用远程站点全站数据,一款脚本级反向代理程序.

    前些天临时写的一脚本级反向代理程序,用法很简单,设置好目标站地址,然后放到你网站根目录:index.asp,再将404页面自定义为:index.asp,即可. 由于暂时没有 url 替换需要,所以没有 ...

  2. Powershell的内置变量

    ls Variable:     Name Value Description $     ? TRUE Status of last command ^     args System.Object ...

  3. iOS 键盘的隐藏

     在 iOS开发中 最常用的 一些控件,如TextFiled 和 TextView,点击时会自动弹出键盘,但是隐藏操作需要我们自己来编码完成. 最常用的一种方法是,让TextFiled 和 TextV ...

  4. ProtocalBuffers学习记录

    Google Protocol Buffer 的使用和原理 Google Protocol Buffers 概述 Google Protocol Buffers 入门 Protocol Buffers ...

  5. Windows中杀死占用某个端口的进程

    Windows中杀死占用某个端口的进程 netstat -ano | findstr //列出进程极其占用的端口,且包含 80 tasklist | findstr taskkill -PID < ...

  6. apache日志文件太大的问题

    apache日志文件太大的问题 处理Apache日志的两种方法 rotatelogs 是 Apache 2.2 中自带的管道日志程序 rotatelogs [ -l ] logfile [ rotat ...

  7. GitHub超详细图文攻略

    GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git 分类: 转载2014-03-25 21:10 10641人阅读 评论(2) 收藏 举报 GitHubbr ...

  8. 解决Ecshop因为动态ip问题登录后台自动退出

    解决Ecshop因为动态ip问题登录后台自动退出 PHP  铁匠  2年前 (2013-07-21)  1130℃  0评论 修改lib_base.php文件real_ip()函数,添加以下代码即可解 ...

  9. 会php不回缓存行吗?多重实现

    1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中 ...

  10. Java中的可变参数以及foreach语句

    Java中的可变参数的定义格式如下: 返回值类型  方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型  变量名称 :数据名称){ ... } public ...