[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:%@ \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;
}

打印结果如下:
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>"
) 
时间: 2024-10-25 20:56:51

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

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

控制器Controller 在添加控制器前,我们先看下它为我们自动生成的一些Controller,我们看下AccountController.cs 来看下登录验证方法Login !!!跟以前的写法好像很多地方不一样?async这个应该是异步 干什么用的呢 ? Task<IActionResult> 是什么? var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.Remem

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

MVC 代表 模型-视图-控制器.MVC 是一个模式用于开发应用程序是很好的架构. 可检验性和易于维护.基于 MVC 的应用程序包含: Models: 类表示应用程序的数据并使用验证逻辑以执行这些数据的业务规则. Views: 您的应用程序使用动态生成 HTML 响应的模板文件. Controllers: 处理传入的浏览器请求的类检索模型数据,然后指定将响应返回到浏览器的视图模板. 我们将涵盖所有这些概念在本系列教程中的,向您展示如何使用它们来构建应用程序. 让我们开始创建一个控制器类.在 的解

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

基于MVC的应用程序包含三个部分 Models(模型):对应用程序的数据进行处理 Views(视图):动态生成HTML,显示数据 Controllers(控制器):应用程序中处理用户交互的部分,处理浏览器请求,检索数据模型,然后响应给视图 添加控制器 在“解决方案”中,右键点击“Controllers”文件夹,然后依次选择“添加”,“控制器” 在”添加控制器“窗口中,将控制器名称命名为“HelloWorldController”,模板为“空 MVC 控制器”,然后点击”确定“按钮 像下面那样将V

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

1 创建并运行第一个App 1.1 问题 使用Xcode创建一个App项目,该应用实现功能在界面上显示Hello World标签,在模拟器中的运行结果如图-1所示: 图-1 1.2 方案 分析图-1,首先使用Xcode创建一个Single ViewApplicaton应用,起名为MyFirstApp,如图-2所示: 图-2 然后删除Xcode的导航栏里只保留TRAppDelegate.h文件和TRAppDelageat.m文件,其他代码文件.storyboard文件以及xib文件删除,如图-3所

同一个界面多个子控制器切换视图

先看示例: EssenceViewController为父控制器. AllViewController =>全部 VideoViewController =>视频 VoiceViewController =>声音 PictureViewController =>图片 WordViewController =>段子 一.分析 1.顶部菜单栏 大的UIView里包含 一个子UIView(菜单选中的底部指示器)和5个菜单UIButton. 2.中间内容区域是UIScrollView

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

前言 本篇博文主要介绍ASP.NET MVC中的三个核心元素:控制器.视图与模型,以下思维导图描述了本文的主要内容. 控制器 控制器简介 在介绍控制器之前,简单的介绍一下MVC工作原理:URL告知路由机制该使用哪个控制器(Controller),调用该控制器中的哪个方法(Action),并为该方法提供需要的参数.控制器响应用户的输入,在响应时修改模型(Model),并决定使用哪个视图(View),并对该视图进行渲染.注意:MVC模式提供的是方法调用结果,而不是动态生成的页面. 以上内容对于初学者

【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序

一.UITabBarController的几种代理方法 在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>,然后再AppDelegate.m中添加如下代理方法: 如果没有效果,可能是缺少tbCon1.delegate=self;把代理指定给当前AppDelegate. -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:

实现控制器和视图

?1.0 简介 iOS7已经推出了很多新的功能给用户,以及大量新的API为我们程序员使用和发挥.你可能已经知道,用户界面大幅的的iOS7,现在这个用户界面也保持完好一路从iOS的第一个版本到,正因为如此,许多应用程序进行编码的假设改变,该用户界面会永远不会改变.平面设计师正面临着创建用户界面,并考虑用户的挑战,前perience的方式,使得它非常适合前和后的iOS7的用户界面(UI). 为了编写应用程序为iOS7,你需要知道一些,我们将在本书中使用Objective- C语言编程的基础知识. O

Asp.Net Core MVC控制器和视图之间传值

一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例  1.ViewData public IActionResult Index() { //测试的 时候在Cummuty2017的最新版中右键添加视图生成的 视图文件的编码 为ANSI对于中文显示乱码 //使用ViewData 实现 控制器 和 视图之间传值 /* * 1.ViewData指定键值对的方式设置或读取 数据 * 2.