- 一個iOS的app很少只由一個控制器組成,除非這個app極其簡單。
- 當app中有多個控制器的時候,我們就需要對這些控制器進行管理。
- 有多個view時,可以用一個大的view去管理1個或者多個小view
- 控制器也是如此,用1個控制器去管理其他多個控制器
- 比如,用一個控制器A去管理3個控制器B、C、D
- 控制器A被稱為控制器B、C、D的“父控制器”
- 控制器B、C、D的被稱為控制器A的“子控制器”
為了便於管理控制器,iOS提供了2個比較特殊的控制器
UINavigationController
UITabBarController
在iOS中,利用UINavigationController,可以輕松地管理多個控制器,輕松完成控制器之間的切換,典型例子就是系統自帶的“設置”應用:
UINavigationController的使用步驟:
1、初始化UINavigationController;
1 UINavigationController *nav = [[UINavigationController alloc] init];
2、設置UIWindow的rootViewController為UINavigationController;
1 window.rootViewController = nav; 2 [window makeKeyAndVisible];
3、根據具體情況,通過push方法添加對應個數的子控制器;
1 [self.navigationController pushViewController:OneViewController animated:YES];//假設已初始化一個名為OneViewController的子控制器
UINavigationController的子控制器:
1 //UINavigationController以棧的形式保存子控制器 2 @property(nonatomic,copy) NSArray *viewControllers; 3 @property(nonatomic,readonly) NSArray *childViewControllers; 4 5 //使用push方法能將某個控制器壓入棧 6 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 7 8 //使用pop方法可以移除控制器 9 //將棧頂的控制器移除 10 - (UIViewController *)popViewControllerAnimated:(BOOL)animated; 11 //回到指定的子控制器 12 - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 13 //回到根控制器(棧底控制器) 14 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
初始化UINavigationController時,可以通過initWithRootViewController:方法傳入一個控制器作為根控制器,這個根控制器永遠處於棧底(如果棧中只有一個對象,那么根控制器也處於棧頂)。
如何修改導航欄的內容:
1 //導航欄的內容由棧頂控制器的navigationItem屬性決定 2 3 //UINavigationItem有以下屬性影響着導航欄的內容 4 //左上角的返回按鈕 5 @property(nonatomic,retain) UIBarButtonItem *backBarButtonItem; 6 //中間的標題視圖 7 @property(nonatomic,retain) UIView *titleView; 8 //中間的標題文字 9 @property(nonatomic,copy) NSString *title; 10 //左上角的視圖 11 @property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem; 12 //右上角的視圖 13 @property(nonatomic,retain)UIBarButtonItem *rightBarButtonItem
一些注意點:
1、在當前的導航控制器設置返回按鈕,只是設置下一個導航控制器的返回按鈕。
2、設置導航控制器的返回按鈕,自定義一個按鈕或者設置返回按鈕的圖片也是無效的,如要自定義,那么可以通過設置導航控制器的左邊按鈕來替換。
3、在storyboard中設置導航控制器時,使用push連接是ios 5之前的用法,會自動生成導航標題欄,而ios 6 之后是用show連接,不會生成導航標題欄,如要設置,可以直接拖控件。
4、導航控制器添加的第一個視圖控制器是根控制器,是永遠都不會從棧堆中彈出的。
5、源視圖控制器和目的視圖控制器是通過sugue連接的。(例如:第一個視圖控制器sugue到第二個視圖控制器)
6、如果視圖控制器從棧中移除后,會銷毀,調用dealloc方法。
