UINavigationController和UItableviewController一样也是iOS开发中常用的控件之一,今天就来学习一下它的常见用法。
        有人说tableview是最难的,因为涉及到和数据的交互,但在我看来,UINavigationController应该是相对来说挺复杂的一个控件,因为移动端的开发,用户体验是最重要的,所以好的视觉交互成了必不可少的一部分,这就要求我们在视觉层面上多下功夫,UINavigationController里面各属性的耦合,的确有些繁琐,今天就来好好看一下。
        UINavigationController是一个导航控制器,可以控制不同页面之间的跳转,比如我们通常做的,点击某个按钮进入到另一个页面,按返回又能回来,这就是导航控制器的作用,我们可以想象成在一个导航下面有N多个页面,这些页面都是受这一个导航控制的。
        UINavigationController具有好几个属性,我们暂且理解为分为好几层,它们分别为Navigationbar,Navigationtoolbar等。下面我们从UINavigationController的创建来开始它的学习。
        按照我们正常的逻辑,app在加载的时候是会有一个默认的rootView的,我们通常都是将我们需要展示的那个页面设为RootViewController,但是现在,我们是通过导航来管理我们的页面的,因而,在导航创建的时候,我们绑定我们需要展示的那个页面,在利用导航控制器的时候,我们一定要树立的思想是,页面在导航下,导航只有一个的概念,而不是想着导航只是页面上方的一个控件,这样思考不利于开发的进行。所以,我们首先创建一个UIViewController,我们将它命名为MyViewController,在appdelefate.m里,我们这样写:
MyViewController *mvc= [[FirstViewController alloc]init];  
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:mvc];
self.window.rootViewController = nav;

然后将根视图控制器设置成导航控制器,这样就成功的将页面加载到导航上面。

接下来我们需要明确一个概念:navigationBar
那什么是navigationBar呢?我们将其理解为导航条 。导航控制器是一个整体的概念,具体到我们直观看到的,是当前导航控制器的导航条,即navigationBar。而且,导航条是属于整个导航的,不是属于某一个固定的ViewController。如果我们不需要展示导航,那么我们应当这样设置:
 self.navigationController.navigationBarHidden = YES;
这样的话,导航条便不会显示。
同样的思路来思考问题,我们如果要设置导航条的背景色,当然也是要设置navigationBar的颜色
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
如果要设置选染色的话,应该为
 self.navigationController.navigationBar.tintColor = [UIColor greenColor];
好,现在我们知道了navigationBar针对整个导航而言的,那么现在我们需要对于单个页面的导航条进行我们的定制操作该怎么办呢?那就是接下来这个概念:navigationItem
比如我要设置当前页的导航Title,那么我就可以这样写:
 self.navigationItem.title = @"111";
从理论角度来看,navigationItem是UIViewController的一个属性,而且它是为UINavigationController服务的,从官方文档给出的解释来看,navigation item在navigation Bar代表一个viewController每一个加到navigationController的viewController都会有一个对应的navigationItem,所以,我们可以将这个属性看做每个每个页面独有的导航条。
所以,我们也可以创建一个Label,将我们的title用title的方式展现出来,titleView可以自定义

UILabel *titleLabel = [[UILabelalloc]initWithFrame:CGRectMake(0, 0, 60, 40)];

titleLabel.text = @"标题";

titleLabel.textAlignment = NSTextAlignmentCenter;

titleLabel.backgroundColor = [UIColorwhiteColor];

self.navigationItem.titleView = titleLabel;

在我们当前页的导航条上,我们经常需要创建按钮,首先第一种,导航条自带专用按钮UIBarButtonItem

也就是navigationItem的属性,一般分为三种:leftBarButtonItem,rightBarButtonItem,backBarButtonItem ,我们可以通过自定义,图片,文字,系统风格这几种样式去创建

UIBarButtonItem *lbn= [[UIBarButtonItemalloc]initWithTitle:@"lbn"style:UIBarButtonItemStyleBorderedtarget:selfaction:@selector(lbnClick)];

self.navigationItem.leftBarButtonItem = lbn;

当然,如果需要创建多个专用按钮,那我们可以给这些按钮加到一个数组里,然后添加数组为按钮就可以了。

导航还有一个属性,toolBar,它和导航条一样,是针对整个导航的,默认是隐藏的,我们需要先设置它的隐藏属性,才能够看到效果:

  self.navigationController.toolbarHidden = NO;
toolBar的高度为44,在当前页面的底部。和tabbar不一样的是,它设置的是当前页,tabbar则对应多个ViewController,通过这一行代码来定义toolBar的样式:
   [self.navigationController.toolbarsetBackgroundImage:[UIImageimageNamed:@"header_bg"] forToolbarPosition:UIBarPositionBottombarMetrics:UIBarMetricsDefault];
和导航条的专用按钮一样,我们同样可以通过不同方式创建toolBar的专用按钮,然后添加到self。toolBarItems中。
创建了按钮,我们可以给按钮添加点击事件,就按照正常的方式去添加就可以了。
导航里,如果我点击按钮跳转到新的页面,那么我们可以这样去实现:
[self.navigationController pushViewController:secondVC animated:YES];

或者是

[self.navigationController popViewControllerAnimated:YES];

pop与push有什么区别呢,push可以理解为跳转到固定的页面,pop则是返回,ViewController需要提前建立。

如果是普通按钮,跳转的页面也不在导航里,我们则可以使用present推出新页面。跳回方法:   
[self dismissViewControllerAnimated:<#(BOOL)#> completion:<#^(void)completion#>];
需要注意的一点是:当push出新页面时,是会自带一个返回按钮的,如果需要自己定制,那么要先隐藏然后再去自定义添加专用按钮。

 
 

iOS学习心得——UINavigationController的更多相关文章

  1. iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...

  2. [转]iOS学习之UINavigationController详解与使用(三)ToolBar

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...

  3. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  4. iOS学习之UINavigationController详解与使用(三)ToolBar

    1.显示Toolbar  在RootViewController.m的- (void)viewDidLoad方法中添加代码,这样Toobar就显示出来了. [cpp] view plaincopy [ ...

  5. iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. ...

  6. iOS学习心得——UITableViewCell的复用

    UITableView是在iOS开发中最常用的控件之一.我的第一篇学习心得献给它了         UITableView是由一行一行的UITableViewCell构成的.         首先想这 ...

  7. [转]iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    转载地址:http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINav ...

  8. iOS学习之UINavigationController

    一.UINavigationController      1.UINavigationController:导航控制器,是iOS中最常用的多视图控制器之一,用它来管理多个视图控制器.可以称为是管理控 ...

  9. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

随机推荐

  1. MHA自动切换流程

    MHA的全名叫做mysql-master-ha,配置后可以在10-30秒内完成master自动切换,切换过程如下: 1. 检测master的状态,方法是一秒一次“ SELECT 1 As Value” ...

  2. web.xml中的主要元素说明(listener, filter, servlet)

    web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...

  3. NodeJS初学者实战之旅(I) —— 介绍、目录

    旅行之初 作为一个工作了两年多后端开发人员,未接触过NodeJS,对它的认知也仅仅停留在“可以使用JavaScript代码编写服务端程序”上.最近空闲时间 较多,便想来啃它一啃.但是没有一个实际的玩意 ...

  4. python 学习之爬虫练习

    通过学习python,写两个简单的爬虫,没用线程,本地抓取速度还不错,有些瑕疵就是抓的图片有些显示不出来,代码做个笔记记录下: # -*- coding:utf-8 -*- import re imp ...

  5. c++STL之sort排序

    排序算法为竞赛中最常用的算法之一,我们可以利用C++自带的库函数进行排序.                                                                ...

  6. Mysql JOIN优化。

    join性能自行百度,google 数据60w+,这里我只测试了一个limit , ) ,) AS C LEFT JOIN table2 AS B ON C.e_id=B.id; ) ,;

  7. 网络受限下,使用Nexus要解决的两个问题

    在网络受限的情况下,使用nexus总会遇到这么两个问题,让你头疼. 我头疼过了,为了不让大家头疼,把解决方案放在这里,供大家参考.   问题一.背景: 由于网络原因,Nexus无法更新远程仓库的索引. ...

  8. 移动端-弹窗demo

    <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name ...

  9. 【ecos学习5】redboot 加载运行hello world

    背景: 从主机 192.168.2.14 IP,下载bin文件hello到ecos. redboot>load -v -h 192.168.2.14 hello Using default pr ...

  10. Net Core WebApi单元测试

    单元测试 本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json  ...