UINavigationController
UINavigationController:导航控制器,是iOS中最常用的多视图控制器之一,它用来管理多个视图控制器。导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的控制器。
UINavigationController继承于UIViewController,以栈的方式管理所控制的视图控制器,至少要有一个被管理的视图控制器,这个控制器我们称作,导航控制器的根视图控制器。任何继承自UIViewController的类(多态)都可以作为根控制器。
UINavigationController通过栈的方式管理控制器的切换,控制入栈和出栈来展示各个视图控制器。UINavigationController的ContentView里始终显示栈顶控制器的view。viewControllers属性存储了栈中的所有被管理的控制器navigationController属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在的UINavigationController对象。
UINavigationController初始化
//初始化rootVC(rootVC为navC的根视图控制器,也就是首个被navC管理的视图控制器)
RootViewController *rootVC = [[RootViewController alloc] init];//自定义一个RootViewController类
//初始化navC 初始化方法使用的是可以给navC设置根视图控制器的方法
UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:rootVC];
//将navC设置为window设置根视图控制器
[self.window setRootViewController:navC];
UINavigationController的常用方法
pushViewController:animated:进入下一个视图控制器
[self.navigationController pushViewController:secondVC animated:YES];```
popViewControllerAnimated:返回上一个视图控制器
`[self.navigationController popViewControllerAnimated:YES];`
popToViewController:animated :返回到指定的视图控制器
`[self.navigationController popToViewController:self.navigationController.viewControllers[0] animated:YES];`
popToRootViewControllerAnimated:返回到根视图控制器
`[self.navigationController popToRootViewControllerAnimated:YES];`
##UINavigationController常用属性
viewControllers:所有处于栈中的控制器
`NSLog(@"%@",self.navigationController.viewControllers);`
topViewController:位于栈顶的控制器
`NSLog(@"%@",self.navigationController.topViewController);`
visibleViewController:当前正在显示的控制器
`self.navigationController.visibleViewController`
#navigationBar:
导航条,iOS7之后默认是透明的,iOS7之前默认是不透明的UINavigationBar除了能定义自身的样式外,还管理一组UINavigationItem。
##navigationBar常用的属性
barTintColor:navgationBar上面按钮的颜色
`navC.navigationBar.barTintColor = [UIColor greenColor];`
backgroundColor:背景颜色
`navC.navigationBar.backgroundColor = [UIColor grayColor];`
translucent:navigationBar的透明状态,默认是半透明的
`navC.navigationBar.translucent = NO;`
barStyle:设置navigationBar的样式,系统提供的只有两种
`navC.navigationBar.barStyle = UIBarStyleBlack;`
setBackgroundImage:forBarMetrics:设置navigationBar的背景图片
* UIBarMetricsDefault 横、竖屏状态下的背景图片
* UIBarMetricsCompact 横屏状态下得的景图片
`[navC.navigationBar setBackgroundImage:[UIImage imageNamed:@"001.png"] forBarMetrics:UIBarMetricsDefault];`
#UINavigationItem
每个视图控制器都有一个navigationItem属性。navigationItem中设置的左按钮、右按钮、标题等,会随着控制器的显示,也显示到navigationBar上。UINavigationItem属于MVC中的M。封装了要显示在UINavigationBar上的数据。
##UINavigationItem常用属性
title:标题,
`self.navigationItem.title = @"导航控制器";`
titleView:标题视图
``` UILabel *titleLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 40)];
titleLable.text = @"titleView";
titleLable.backgroundColor = [UIColor orangeColor];
titleLable.textAlignment = NSTextAlignmentCenter;
self.navigationItem.titleView = titleLable;```
leftBarButtonItem:左按钮(可以添加一组左按钮)
```//创建左边按钮
UIBarButtonItem *leftBtnItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStylePlain target:self action:@selector(leftBtnAction:)];
self.navigationItem.leftBarButtonItem = leftBtnItem;```
rightBarButtonItem:右按钮(可以添加一组右按钮)
```//创建navBar的右边按钮
UIBarButtonItem *rightBtnItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(rightBtnAction:)];
//设置右边按钮
self.navigationItem.rightBarButtonItem = rightBtnItem;
界面间传值
1.使用属性传值解决从前往后传值的问题,例如,A页面跳转到B页面,在B页面的控制器中,编写对应的属性,在A页面跳转到B页面的地方,给B的属性赋值。
2.使用delegate解决从后往前传值的问题,例如,A页面跳转到B页面,在从B页面跳回A页面,把B页面的值传到A页面时使用代理的方法。首先,在B页面中的.h文件中添加协议和相应的代理属性,在B跳转到A页面时通过代理调用协议方法。其次,在A页面的.m文件中引入B页面的协议,并在A页面跳转到B页面时指定其自身为B页面的代理。最后在A页面中实现协议中的代理方法。