1、概述:
利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用。
2、UINavigationController的简单使用
UINavigationController的使用步骤:
在MJAppDelegate的didFinishLaunchingWithOptions方法中完成下述操作:
(1) 初始化UINavigationController
UINavigationController *nav = [[UINavigationController alloc] init];
(2) 设置UIWindow的rootViewController为UINavigationController
self.window.rootViewController = nav;
(3) 根据具体情况,通过push方法添加对应个数的子控制器
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor redColor];
[nav pushViewController:vc1 animated:YES];
UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor greenColor];
[nav pushViewController:vc2 animated:YES];
运行效果:
在实际开发中往往是将一个ViewController加入UINavigationController,点击其中的按钮跳转到下一个ViewController。点击按钮跳转到下一个ViewController代码:
TwoViewController *two = [[TwoViewController alloc] init];
[self.navigationController pushViewController:two animated:YES];
跳转到下一个ViewController后最上方导航栏会自动出现back按钮,点击可返回原来界面。
3、UINavigationController的子控制器
UINavigationController以栈的形式保存子控制器,初始化UINavigationController时,可以通过initWithRootViewController:方法传入一个控制器作为根控制器,这个根控制器永远处于栈底(如果栈中只有一个对象,那么根控制器也处于栈顶)。
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
使用push方法能将某个控制器压入栈:
- (void)pushViewController:(UIViewController *)viewController animated:
(BOOL)animated;
综上,在一个导航控制器中添加子控制器有下面三种方法:
(1)[nav addChildViewController:myViewController];
(2)[nav pushViewController: myViewController animated:YES];
(3)nav.viewControllers = @[ myViewController];
也可在初始化导航控制器时候直接添加子控制器:
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: myViewController];
使用pop方法可以移除控制器:
将栈顶的控制器移除:
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器:
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
回到根控制器(栈底控制器):
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;