UINavigationController既然能够管理多个控制器,那么这些控制器在UINavigationController中是如何管理、又是如何跳转的呢?
前面曾经提到UINavigationController是通过栈来管理子控制器的。具体原理如下:
1> 在UINavigationController初始化的时候会指定它的根控制器。即把该根控制器放在了栈顶。此时UINavigationController就显示rootViewController的view;
2>当点击某个按钮进入另外一个控制器,UINavigationController会将新的控制器viewController再push到栈的顶部,覆盖在rootViewController的上面。此时UINavigationController显示的控制器就是新的控制器;
针对UINavigationController的页面跳转有2种方式:
1> 通过拖线(利用storyboard)
现在新建项目,开始拖线。“第一页”是UINavigationController的rootViewController,在rootViewController中添加一个跳转按钮,鼠标右键点击拖线到“第二页”控制器。
运行结果:(看控制器标题就行,忽略颜色)
点击按钮之后:
2> 通过代码
现在开始写代码。我这里创建的是空项目,没有Main.storyboard。如果你创建的不是空项目,可将Main.storyboard删除,并在TARGETS-> Deployment Info -> Main Interface下删除Main即可。
a. 创建并初始化UINavigationController,在项目中New File…两个控制器ViewController和TwoViewController,将ViewController设置为UINavigationController的根控制器,并将UINavigationController作为窗口的根视图,再显示出来。
//创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
//创建导航栏,并设置导航栏根视图
ViewController *mainVC = [[ViewController alloc] init];
mainVC.navigationItem.title = @"第一页";
UINavigationController *navigationC = [[UINavigationController alloc] initWithRootViewController:mainVC];
//设置窗口主视图
self.window.rootViewController = navigationC;
//使窗口可见
[self.window makeKeyAndVisible];
b.
在ViewController中,包含TwoViewController头文件,再创建一个跳转按钮。
- (void)viewDidLoad {
[super viewDidLoad];
//创建按钮
UIButton *button = [[UIButton alloc] init];
button.frame = CGRectMake(100, 200, 200, 40);
[self.view addSubview:button];
//设置按钮属性
[button setTitle:@"跳到第二页" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//监听按钮点击
[button addTarget:self action:@selector(clickButton) forControlEvents:UIControlEventTouchUpInside];
}
- (void)clickButton {
TwoViewController *two = [[TwoViewController alloc] init];
[self.navigationController pushViewController:two animated:YES];
}
c. 在第二个控制器的viewDidLoad方法中给第二个控制器添加标题和背景颜色。
self.navigationItem.title = @"第二页";
self.view.backgroundColor = [UIColor redColor];
d.
运行效果,加跳转效果
以上代码写完,UINavigationController管理了两个控制器,利用push/pop就能将控制器推入和弹出栈的顶部,从而实现控制器跳转。
注意:UINavigationController在跳到下一个控制器后,下一个控制器的导航条的左边会自带一个返回按钮。根控制器不能执行pop,即不能被弹出栈。
至此,针对于UINavigationController的控制器跳转已经讲完了。对于UINavigationController的第一种跳转方式(拖线),其中还有两个模式,将在后续文章中讲到。