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. zookeeper 丢失事件/miss event

    今天在统计页面上发现有个节点丢失了,经过仔细分析后,发现同一个节点上的二个应用(同时监控zk)其中一个丢失了一个event,检查zk cluster没有发现异常... 通过网络搜寻,出现miss ev ...

  2. js/css 检测移动设备方向的变化 判断横竖屏幕

    js/css 检测移动设备方向的变化 判断横竖屏幕 方法一:用触发手机的横屏和竖屏之间的切换的事件 window.addEventListener("orientationchange&qu ...

  3. maven命令/依赖/聚合

    一,编写pom.xml   首先我们看一下pom.xml   <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns ...

  4. javascript事件委托和jQuery事件绑定on、off 和one

    一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...

  5. 分析BGARefreshLayout-master

    一.知识点,创建BaseActivity 建立方法的逻辑顺序 并将一些常用的方法填充到其中 ①.将initView().setListener().onClick().processLogic()方法 ...

  6. 寒冰王座(hd1248)

    寒冰王座 Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店 ...

  7. 使用SelectClipRgn注意事项

    SelectClipRgn 函数功能:该函数选择一个区域作为指定设备环境的当前剪切区域. 函数原型:int SelectClipRgn(HDc hdc, HRGN hrgn): 参数: hdc:设备环 ...

  8. Oracle EBS-SQL (PO-14):检查供应商信息sql

    select pvs.org_id, pvs.vendor_id, pvs.vendor_site_id, hou.name                                 经营组织, ...

  9. View, Activity, Window

    View, Activity, Window 2010-03-02 10:42:56|  分类: android|举报|字号 订阅     对于屏幕显示而言,整个是window,这个window里显示 ...

  10. Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...