一個iOS的app不多隻由一個ViewController組成,除非這個app極其簡單。當app中有多個ViewController的時候,咱們就須要對這些ViewController進行管理app
容器:負責展現一個或者多個ViewController,並管理這些View Controller的視圖生命週期性能
大部分容器自己也是一個ViewController, 被容器管理的這些控制器能夠稱爲容器的子控制器(ChildViewController),而容器能夠被稱爲父控制器(parentViewController)spa
也有極少數容器不是ViewController,好比UIPopoverController,其繼承於NSObject對象
經常使用的Container:UITabbarController、UINavigationController繼承
能夠添加ChildViewController, 移除ChildViewController,切換ChildViewController的顯示,生命週期
持有全部ChildViewController的實例(通常存在NSArray中)事件
負責ChildViewController的生命週期方法的調用圖片
(viewWillAppear,viewDidAppear,viewWillDisaapper,viewDidDisappear),以及旋轉事件的傳遞it
一個UITabBarController的view由兩部分組成io
上面部分用來容納子控制器的view
下面部分是一個UITabBar對象,會根據子控制器的tabBarItem屬性生成相應的圖標和標題
經過設置viewControllers屬性或者addChildViewController方法能夠添加子控制器
NSArray *viewControllers
- (void)addChildViewController:(UIViewController *)childController
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以棧的形式保存子控制器,這裏的棧實際上是個NSArray對象,只有位於棧頂的子控制器的view纔是可見的
初始化UINavigationController時,須要傳入一個UIViewController實例做爲根控制器,這個根控制器永遠處於棧底(若是棧中只有一個對象,那麼根控制器也處於棧頂)
將某個UIViewController壓入棧時,控制器的視圖會從窗口右側滑入;出棧時,棧頂的控制器會被移除,其下的控制器的視圖會從窗口左側滑入
經常使用屬性:
UIViewController *topViewController 處於棧頂的子控制器
NSArray *viewControllers 棧,存放着全部的子控制器
UINavigationController的view包括了兩大部分:
上面是UINavigationBar
下面是topViewController的view,topViewController的navigationItem屬性決定了UINavigationBar顯示的內容
注意:UINavigationItem並非UIView的子類
除了title,UINavigationItem還有一些屬性可以影響UINavigationBar的顯示內容
UIBarButtonItem *backBarButtonItem 左上角的返回按鈕
UIView *titleView 中間的標題視圖
UIBarButtonItem *leftBarButtonItem 左上角的視圖
UIBarButtonItem *rightBarButtonItem 右上角的視圖
UINavigationController添加子控制器
UINavigationController的pushViewController:animated:方法能夠將一個控制器壓入棧中
子控制器都有個navigationController屬性,能夠獲取當前的UINavigationController對象
假如從子控制器c1跳轉到子控制器c2,能夠這樣作:
[c1.navigationController pushViewController:c2 animated:YES];