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. 【类似N^N做法的斐波那契数列】【HDU1568】 Fibonacci

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. oracle中的rowid和数据行的结构

    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

  3. ButterKnife你需要知道的点

    ButterKnife,这个方便findViewById而使用的库,无数的应用在使用它,以注解来实现的他,对应用的性能影响几乎可以忽略,可以放心使用. 使用: compile 'com.jakewha ...

  4. 纯CSS3技术 加载中

    你能相信吗?这些都是由一个DIV元素实现的动画,纯CSS3技术 html  <div class="loader">加载中...</div> css: 图( ...

  5. WDLINUX (Centos5.8) 安装 bcmath

    环境 centos5.8 php5.2.17 因为wdos 集成的php5.2.17为精简版,并未包含php52-bcmath扩展. 所以先下载完整php5.2.17源码包 wget -c http: ...

  6. 比较常见的const与指针的组合情况

    1.对于普通的const与基本类型组合,都是表示的是这是一个常量, const int a; int const a; 表示的意思是一样的,a是一个常量,不可改变 2.对于const与指针组合在一起, ...

  7. Red and Black(水)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. 1.C语言关键字(auto break case char const swtich)

    ANSI C标准C语言共有32个关键字,分别为: auto break case char const continue default do double else enum extern floa ...

  9. linux----用户与whoami

    linux中的su 命令可以完成用户切换:如我们先由root切换到mysql用户可以这样做su - mysql whoami #这个时候linux会打印出mysql who am i #这个时候lin ...

  10. SD卡在单片机上的应用

    (1)SD卡的引脚定义:  SD卡SPI模式下与单片机的连接图: 注意:SPI模式时,这些信号需要在主机端用10~100K欧的电阻上拉.      SD卡支持两种总线方式:SD方式与SPI方式.    ...