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. 【贪心】【HDU3177】 搬家问题

    </pre><pre name="code" class="cpp">#include <iostream> #includ ...

  2. LINQ 之四 (SkipWhile和TakeWhile)

    看到书上的例子很正常,于是,我写了个不正常一点的. 书上的是这样的 class Program { static void Main(string[] args) { ,,,,,,,,}; ); fo ...

  3. Windows7中安装内存与可用内存不一致的解决办法

    转载:http://blog.sina.com.cn/s/blog_56741a420100h9d1.html 问题现象: 安装完Windows7后,在计算机->属性中,会看到安装内存.但有时在 ...

  4. RelativeLayout与LinearLayout的区别

    1.LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的 containers,超过边界时,某些控件将缺失或消失.因此一个垂 ...

  5. 沼跃鱼早已看穿了一切 C/C++

      沼跃鱼早已看穿了一切 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 593  Solved: 229[Submit][Status][Web Boa ...

  6. python学习笔记:python字符串

    二.python字符串操作符 1. 对象标准类型操作符 Python对象的标准类型操作符一共就三种:对象值的比较.对象身份的比较.布尔类型.其中对象值的比较主要是大于.小于.不等于等的数学比较符:对象 ...

  7. CENTOS 挂载硬盘

    查看物理卷:pvs 查看卷组:vgs 列出分区:lvs 查看磁盘:ll /dev/disk/by-path/ 扫描 LVM 找到 VG vgscan centos 下 mount: unknown f ...

  8. 从数据库读取数据后显示成html标签

    也许很多人从数据库中读的数据是不需要数据成html标签的,但是也许有一天你们会发现当我们需要输出成html标签时编译器却自动帮我们输出成字符串了这是我们可以这样来 方法1: 最常用的方法,使用JS或J ...

  9. Nginx 变量漫谈(五)

    前面在 (二) 中我们已经了解到变量值容器的生命期是与请求绑定的,但是我当时有意避开了“请求”的正式定义.大家应当一直默认这里的“请求”都是指客户端发起的 HTTP 请求.其实在 Nginx 世界里有 ...

  10. Android 控件属性

    TextView 文字属性//文字左右居中android:layout_centerHorizontal="true"//文字垂直居中android:layout_centerVe ...