在iOS當(dāng)中提供了兩個(gè)比較特殊的控制器,
一個(gè)是NSNavigationController
一個(gè)是NSTabBarController
他們是用來(lái)管理控制器的控制器
UINavigationController 導(dǎo)航控制器:
一、功能:實(shí)現(xiàn)頁(yè)面之間的跳轉(zhuǎn)
當(dāng)跳轉(zhuǎn)到下一個(gè)子控制器時(shí),它默認(rèn)的就有返回功能,而且自帶側(cè)邊滑動(dòng)返回功能。
導(dǎo)航控制器的子控制器都可以拿到當(dāng)前的導(dǎo)航控制器
主要的push方法
//想要跳轉(zhuǎn)到下一個(gè)界面, 也就是將下一個(gè)控制器添加給當(dāng)前控制器的子控制器.
[self.navigationController pushViewController:xxxVC animated:YES];
二、基本使用:
1.初始化UINavigationController
2.設(shè)置UIWindow的rootViewController為UINaviationController
3.根據(jù)具體情況,通過(guò)push方法添加對(duì)應(yīng)的子控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.創(chuàng)建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.設(shè)置窗口的根控制器
RootViewController *rootVC = [[RootViewController alloc] init];
// 創(chuàng)建導(dǎo)航控制器
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.window.rootViewController = nav;
// 把一個(gè)控制器添加到導(dǎo)航控制器當(dāng)中
// [nav pushViewController:vc animated:YES];
// 3.顯示窗口
[self.window makeKeyAndVisible];
return YES;
}
三、實(shí)現(xiàn)原理(出棧和入棧)
導(dǎo)航控制器是以棧的形式管理子控制器的,也就是數(shù)組.
里面有兩個(gè)數(shù)組,
分別是ViewControllers和ChildViewControllers, 都是數(shù)組, 保存的都是導(dǎo)航控制器的子控制器.
使用push方法就是把某個(gè)控制器壓入到棧當(dāng)中,即入棧
使用pop方法可以移除控制器,即出棧
- 將棧頂?shù)目刂破饕瞥?/li>
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
- 回到指定的子控制器
指定的控制器必須是導(dǎo)航控制器棧里面的控制器.
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
- 回到根控制器(棧底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
可以通過(guò)push方法給導(dǎo)航控制器添加子控制器
導(dǎo)航控制器會(huì)把子控制器的view添加到導(dǎo)航控制器專(zhuān)門(mén)存放控制器的View上面
導(dǎo)航控制器的initWithRootViewContorller設(shè)置導(dǎo)航控制器的根控制器.
它其實(shí)底層調(diào)用的就是導(dǎo)航控制器的push方法,把傳入的控制器添加為導(dǎo)航控制器的子控制器
注意:導(dǎo)航控制器必須要有一個(gè)根控制器
導(dǎo)航控制器的根控制器就是導(dǎo)航控制器的子控制器
導(dǎo)航控制器當(dāng)中的childsViewControllers數(shù)組,
數(shù)組當(dāng)中存放的都是導(dǎo)航控制器的子控制器
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
- 每一個(gè)控制器都能拿到它當(dāng)前所在的導(dǎo)航控制器,因?yàn)楫?dāng)前的控制器是導(dǎo)航控制器的子控制器。
twiceViewController *twiceVC = [[twiceViewController alloc] init]; [self.navigationController pushViewController:twiceVC animated:YES];