一、Container

一个iOS的app很少只由一个ViewController组成,除非这个app极其简单。当app中有多个ViewController的时候,我们就需要对这些ViewController进行管理

容器:负责展示一个或者多个ViewController,并管理这些View Controller的视图生命周期

大部分容器本身也是一个ViewController, 被容器管理的这些控制器可以称为容器的子控制器(ChildViewController),而容器可以被称为父控制器(parentViewController)

也有极少数容器不是ViewController,比如UIPopoverController,其继承于NSObject

常用的Container:UITabbarController、UINavigationController

二、Container的特征

可以添加ChildViewController, 移除ChildViewController,切换ChildViewController的显示,

持有所有ChildViewController的实例(一般存在NSArray中)

负责ChildViewController的生命周期方法的调用

(viewWillAppear,viewDidAppear,viewWillDisaapper,viewDidDisappear),以及旋转事件的传递

三、UITabBarController

一个UITabBarController的view由两部分组成

上面部分用来容纳子控制器的view

下面部分是一个UITabBar对象,会根据子控制器的tabBarItem属性生成相应的图标和标题

四、UITabBarController添加子控制器

通过设置viewControllers属性或者addChildViewController方法可以添加子控制器

NSArray *viewControllers

- (void)addChildViewController:(UIViewController *)childController

五、UITabBarItem和UITabbar

UIViewController的tabBarItem属性决定了UITabBar显示的内容

使用系统自带的UITabBarItem样式:

controller.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemSearch tag:1] autorelease];

自己设置UITabBarItem的标题和图片:

controller.tabBarItem.title = @”More”;

// controller.title也可以用于设置标题

controller.tabBarItem.image = [UIImage imageNamed:@”more”];

设置UITabBarItem右上角的红色数字

controller.tabBarItem.badgeValue = @”10”;

六、UINavigationController

UINavigationController也是容器的一种,负责子控制器之间的跳转

UINavigationController以栈的形式保存子控制器,这里的栈其实是个NSArray对象,只有位于栈顶的子控制器的view才是可见的

初始化UINavigationController时,需要传入一个UIViewController实例作为根控制器,这个根控制器永远处于栈底(如果栈中只有一个对象,那么根控制器也处于栈顶)

将某个UIViewController压入栈时,控制器的视图会从窗口右侧滑入;出栈时,栈顶的控制器会被移除,其下的控制器的视图会从窗口左侧滑入

常用属性:

UIViewController *topViewController 处于栈顶的子控制器

NSArray *viewControllers 栈,存放着所有的子控制器

七、UINavigationController结构

UINavigationController的view包括了两大部分:

上面是UINavigationBar

下面是topViewController的view,topViewController的navigationItem属性决定了UINavigationBar显示的内容

八、UINavigationBar的标题

注意:UINavigationItem并不是UIView的子类

九、UINavigationItem

除了title,UINavigationItem还有一些属性能够影响UINavigationBar的显示内容

UIBarButtonItem *backBarButtonItem 左上角的返回按钮

UIView *titleView   中间的标题视图

UIBarButtonItem *leftBarButtonItem  左上角的视图

UIBarButtonItem *rightBarButtonItem  右上角的视图

十、UINavigationBar与UINavigationItem

UINavigationController添加子控制器

UINavigationController的pushViewController:animated:方法可以将一个控制器压入栈中

子控制器都有个navigationController属性,可以获取当前的UINavigationController对象

假如从子控制器c1跳转到子控制器c2,可以这样做:

[c1.navigationController pushViewController:c2 animated:YES];

iOS基础 - 控制器管理的更多相关文章

  1. iOS基础 - 控制器

    一.当两个控制器互为父子关系的时候,它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上,就应该让A控制器成为B控制器的子控制器,而B控制器就称为A控制器的父控制器 ...

  2. [iOS基础控件 - 6.11.2] - UINavigationController 多控制器 简单使用

    A.概念 1.通常一个app有多个控制器 2.需要对这些控制器进行管理 3.有多个view的时候,用一个父view去管理多个子view 4.控制器管理也是如此,使用给一个父控制器,去控制子控制器   ...

  3. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  4. iOS基础问答面试

    <简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...

  5. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  6. iOS基础 - iOS程序启动原理

    一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...

  7. 说说iOS与内存管理(上)

    http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...

  8. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  9. iOS视图控制器的生命周期

    今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...

随机推荐

  1. Javascript学习6 - 类、对象、继承

    原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...

  2. Ajax.BeginForm的异步提交数据 简介

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  3. JS如何判断包括IE11在内的IE浏览器

    原文:JS如何判断包括IE11在内的IE浏览器 今天碰到一个奇怪的问题,有一个页面,想指定用IE浏览器打开,在VS开发环境没有问题,但部署到服务器上,即使是用IE打开页面,还是提示"仅支持I ...

  4. Spring中的事务传播行为

    Spring在TransactionDefinition接口中定义了7种类型的事务传播行为,它们规定了事务方法是怎样传播的. PROPAGATION_REQUIRED(最经常使用!):支持当前事务,假 ...

  5. Spring + Spring MVC + Hibernate

    Spring + Spring MVC + Hibernate项目开发集成(注解) Posted on 2015-05-09 11:58 沐浴未来的我和你 阅读(307) 评论(0) 编辑 收藏 在自 ...

  6. Xcode6为什么干掉pch(Precompile Prefix Header)&amp;怎样加入pch文件

    一直在用xcode6开发,但项目都是在xcode5上创建的,所以一直没注意到,xcode6居然干掉pch文件了. 为什么xcode6没有自己主动创建pch文件呢? 简单地看:我们在写项目的时候,大部分 ...

  7. 【百度地图API】如何制作班级地理通讯录?LBS通讯录

    原文:[百度地图API]如何制作班级地理通讯录?LBS通讯录 摘要:班级通讯录必备的功能,比如人员列表,人员地理位置标注,展示复杂信息窗口,公交和驾车等.一般班级人员都不会超过300个,因为可以高效地 ...

  8. FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因

    这可能是很多人在使用Android studio 该插件会发现此错误信息:Compiler output path for module can not be null. check your mod ...

  9. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  10. mono for android 学习记录

    C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...