一、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];