iOS基础 - 控制器管理
一、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基础 - 控制器管理的更多相关文章
- iOS基础 - 控制器
一.当两个控制器互为父子关系的时候,它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上,就应该让A控制器成为B控制器的子控制器,而B控制器就称为A控制器的父控制器 ...
- [iOS基础控件 - 6.11.2] - UINavigationController 多控制器 简单使用
A.概念 1.通常一个app有多个控制器 2.需要对这些控制器进行管理 3.有多个view的时候,用一个父view去管理多个子view 4.控制器管理也是如此,使用给一个父控制器,去控制子控制器 ...
- iOS 视图控制器转场详解
iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- iOS基础 - iOS程序启动原理
一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...
- 说说iOS与内存管理(上)
http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- iOS视图控制器的生命周期
今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...
随机推荐
- [LeetCode] 032. Longest Valid Parentheses (Hard) (C++)
指数:[LeetCode] Leetcode 指标解释 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 032. Lon ...
- 使用ExpandableListView时间轴效果达到
不废话,首先在地图上,查看结果 这是用ExpandableListView来实现时间轴效果,原理比較简单,以月份为第一级,以天为第二级来实现的. package com.hj.main; import ...
- 在LINQ中实现多条件联合主键LEFT JOIN
我昨天遇到一个LINQ下使用多条件比对产生LEFT JOIN的问题,经过深入研究,终于解决了,也让我学到了新的东西,特地拿来分享. 实例:有一张库存异常变更视图KCYD,仓库ID[Ckid]和物品ID ...
- MVC 插件化框架支持原生MVC的Area和路由特性
.NET MVC 插件化框架支持原生MVC的Area和路由特性 前面开放的源码只是简单的Plugin的实现,支持了插件的热插拔,最近晚上偶然想到,原生的MVC提供Areas和RouteAtrribut ...
- php_linux_ubuntu_安装mysql_apache_php
用apt-get方法安装mysql5 + Apache2 + PHP5+Phpmyadmin [建议] http://www.sudu.cn/info/html/edu/20080102/283439 ...
- LeetCode: Best Time to Buy and Sell Stock II [122]
[题目] Say you have an array for which the ith element is the price of a given stock on day i. Design ...
- java web.xml listener servlet 和filter加载顺序
在该项目中总会遇到一些关于加载的优先问题.最近遇到了同样的类别似的,所以,如果你发现信息汇总下,以下是转载其他一些人,毕竟,人们写的不错.它不重复创建的轮.只是略作修改自己的观点. 首先能够肯定的是, ...
- 经典Loading 动漫赏析
0. 传统的菊花Loading动画 假设作为程序猿的你还在用菊花作为Loading动画,是时候换个口味了.来看下5种不错的Loading动画. 几种颜色组成的动画,给用户一个美感. 1.android ...
- LeetCode——Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- Java实现缓存(类似于Redis)
Java实现缓存,类似于Redis的实现,可以缓存对象到内存中,提高访问效率.代码如下: import java.util.ArrayList; import java.util.HashMap; i ...