导航视图控制器的基本概念:
1、导航视图控制器是基于构建分层(有层级)应用程序的主要工具,管理着多个内容视图的换入(压入)和换出(弹出)。自身提供了视图切换的动画效果
2、父类是UIViewController UIViewController是所有视图控制器的父类也叫基类。
3、导航控制器是以栈的形式来实现的栈是一种数据结构,采用一种先进后出(后进先出)的原则。
Tips: 可以将UINavigationController理解成一个栈,这个栈中可以存放很多ViewController。在这个栈创建的时候,我们先给它添加一个ViewController,称为RootViewController,它放在栈底,代表的是刚加载程序的时候显⽰的视图。当⽤用户新选择了一个想要显示的视图时,那个新的ViewController入栈,它所控制的视图就会显示出来。也可以动态的向数组中增加视图控制器,而且最新添加进来的控制器总会处于数组的最上层位置。可以通过viewControllers属性,获取数组中的全部视图。其中第一个元素是根视图,依次类推。
1)向栈中添加一个对象称为入栈(push)也称为压栈,即把对象推入到了栈里
2)第一个入栈的对象叫做基栈或栈底
3)最后一个入栈的对象叫做栈顶
4)在栈中删除一个对象的操作叫做出栈(pop)
5)当前显示的视图控制器,即为栈顶选择返回时,这个控制器就出栈了
1、创建导航控制器初始化根控制器
2、压栈和出栈怎样获得self.navigationController 它是在什么时候有值的
3、导航条的隐藏和显示
4、导航的返回规律几种返回方式
一、导航栏UINavigationBar
位于导航视图最顶端的是导航栏,它是UINavigationBar类型的对象。可以显式导航中最顶端的视图的title属性。每一个视图控制器都有一个UINavigationItem类型的属性navigationItem;
navigationItem又有3个属性,分别是:leftBarButtonItemrightBarButtonItem、和titleView。其中titleView可以是字符串或是图片,但是不能同时使用。UIBarButtonItem是其中的按钮的类型。
二、导航中的属性和方法的使用:
1. navigationController
是每一个视图控制器都有的属性,获取导航航控制器对象;这个属性是当本视图控制器添加到导航控制器中时才会返回本视图控制器所在的导航控制器,反之返回nil;
2. 设置导航栏标题
self.title
self.navigationItem.title 此属性也是当视图控制器添加到导航控制器上时才可用。
3.导航条navigationBar 导航控制器只有一个导航条,所有的视图控制器共用这一个导航条;
设置导航条是否隐藏:
[self.navigationControllersetNavigationBarHidden:NOanimated:YES];
self.navigationBarHidden = YES;
4.返回按钮的title显示的优先级
(1) 如果前一页面没有设置标题,返回按钮标题为back;
(2) 如果前一页面设置有标题, 返回按钮标题为前一页面标题;
(3) 如果前一页面设置了返回按钮项(backBarButtonItem)标题,显示设置标题;
(4)如果本页面对返回按钮标题有设置,则本页面的优先级最高;
5. UIBarButtonItem的三种初始化方式:
(1) initWithTitle:
(2) initWithCustomView:
(3) initWithBarButtonSystemItem:
6.视图控制器的出栈:
//(1)这个方法返回上一级视图控制器遵循从哪来回哪去的原则;
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
//(2)这个方法返回到指定视图控制器该视图控制器是需要从导航控制器中找到的而不是创建一个新的视图控制器; 返回一个数组意为出栈了多个视图控制器,数组里装的就是出栈的那些视图控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
//(3)这个方法返回到根视图控制器返回一个数组意为把导航控制器里的视图控制器除根视图控制器外全出栈了。
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
7. 导航传值:
(1)从第一个页面到第二个页面:
在页面1中使用页面2的一个属性保存要传递的值,在页面2中的viewDidLoad及viewWillAppear方法中都可以获取值。
(2)从第二个页面到第一个页面:
在页面2中使用页面1的一个属性保存要传递的值,在页面1的viewWillAppear方法中中获取值。
三、导航条
UINavigationController是做导航用的,具体的操作大部是由导航条来完成,导航条的使用就显得很重要。导航条的内容由控制器的navigationItem属性决定。
1、navigationItem的属性
一般使用self.navigationItem.对应属性来获取属性,或者设置属性。或者使用self.navigationController获取到navigationController,再通过navigationController获取到想要设置的viewController
// 自定义导航条右边按钮
UIButton * btn = [UIButtonbuttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 60, 40);
[btn setTitle:@"下一界面"forState:UIControlStateNormal];
btn.titleLabel.font = [UIFontsystemFontOfSize:12];
[btn setTitleColor:[UIColorredColor] forState:UIControlStateNormal];
[btn addTarget:selfaction:@selector(click) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem * barBtn = [[UIBarButtonItemalloc]initWithCustomView:btn];
self.navigationItem.rightBarButtonItem = barBtn;
// 自定义左边按钮
UIBarButtonItem *leftItem = [[UIBarButtonItemalloc] initWithImage:[UIImageimageNamed:@"gobackItem.png"] style:UIBarButtonItemStylePlaintarget:selfaction:@selector(backViewcontroller)];
UIBarButtonItem *fixedItem = [[UIBarButtonItemalloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpacetarget:nilaction:nil];
// 设置边框距离,个人习惯设为-16,可以根据需要调节
fixedItem.width = -16;
self.navigationItem.leftBarButtonItems = @[fixedItem, leftItem];
2、navigationItem的字体格式
// 字体大小19,颜色为白色
[nav.navigationBarsetTitleTextAttributes:@{NSFontAttributeName:[UIFontsystemFontOfSize:19],NSForegroundColorAttributeName:[UIColorblackColor]}];
3、UINavigationControllerDelegate
// 一般用于传递参数,或者做一些其它处理
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;