1、 UINavigationController 是一个容器类。里面盛放的是UIViewController。

容器的意思是,如果你不放入UIViewController,里面就是空的,什么也没有。

这个容器在管理UIViewController时,遵循栈管理的原则(后进先出)。

UIViewController的入栈操作

UIViewController *aViewController = [[UIView alloc] init;
[self.navigationController pushViewController:aViewController animated:NO];

出栈操作

[self.navigationController popViewControllerAnimated:YES]; 

2、UINavigationController虽然是个容器,但也不是干巴巴的空壳。它由以下四部分组成:Navigation toolbar、Custom content、Navigation bar、,Navigation view。其中,我猜测,入栈的UIViewController 其界面应该就展示在Custom content区域。

参考:http://hi.baidu.com/iphone8/item/f3b3cb6f00cded2e68105b21

UINavigationItem部分

另外据悉,UINavigationController会为每一个入栈的UIViewController生成一个UINavigationItem. UIViewController通过修改UINavigationItem可以控制UINavigationBar上的按钮和标题等。如下:

你可以通过设置self.navigationItem.leftBarButtonItem为某个ButtonItem,

self.navigationItem.leftBarButtonItem

self.navigationItem.rightBarButtonItem

self.navigationItem.backBarButtonItem

self.navigationItem.titleView等等

注:1、这里的self 指的是UIViewController。

2、如果你在新视图中不修改backBarButtonItem 或leftBarButtonItem UINavigationController 会自动添加左边返回按钮用以返回了一个视图。总体的显示原则如下:

 1)、Left side of the navigationBar 左按钮

  a)如果当前的viewController设置了leftBarButtonItem,则显示当前VC所自带的leftBarButtonItem。

  b)如果当前的viewController没有设置leftBarButtonItem,且当前VC不是rootVC的时候,则显示前一层VC的backBarButtonItem。如果前一层的VC没有显示的指定backBarButtonItem的话,系统将会根据前一层VC的title属性自动生成一个back按钮,并显示出来。

  c)如果当前的viewController没有设置leftBarButtonItem,且当前VC已是rootVC的时候,左边将不显示任何东西。

  此处注意:5.0中新增加了一个属性leftItemsSupplementBackButton,通过指定该属性为YES,可以让leftBarButtonItem和backBarButtonItem同时显示,其中leftBarButtonItem显示在backBarButtonItem的右边。

  2)、title 标题

  a)如果当前VC通过 .navigationItem.titleView指定了自定义的titleView,系统将会显示指定的titleView,此处要注意自定义titleView的高度不要超过navigationBar的高度,否则会显示出界。

  b)如果当前VC没有指定titleView,系统则会根据当前VC的title或者当前VC的navigationItem.title的内容创建一个UILabel并显示,其中如果指定了navigationItem.title的话,则优先显示navigationItem.title的内容。

  3)、Right side of the navigationBar  右按钮

  a)如果当前VC指定了rightBarButtonItem的话,则显示指定的内容。

  b)如果当前VC没有指定rightBarButtonItem的话,则不显示任何东西。

参考:http://www.cnblogs.com/smileEvday/archive/2012/05/14/2495153.html

UINavigationBar 部分

切记,UINavigationBar只有一个,它永远只属于UINavigationController,是所有UIViewController公用的。所以,当你修改了UINavigationBar的背景图片或者颜色时,相当于修改了所有UIViewController的NavigationBar的背景图片或颜色。

下面,通过如下视图,我们来了解以下,当系统展示某个具体的UIViewController时,整个页面所有元素的从属关系。

参考:http://www.cnblogs.com/iOS-dd/archive/2013/06/12/3132366.html

uinavigationController、uinavigationBar、uinavigationBarItem三者的区别,现在明白了吗?

通俗地说就是,uinavigationController是个容器,里面可以装很多uiviewController。装这么多uiviewController让用户怎么控制它们呢,总得有个工具吧。这个工具就是uinavigationBar。一个容器就这么一个bar,相当于控制台吧。但是,管理那么多uiviewController,控制台上得按钮啊、标题啊,都千篇一律是不是看起来太无聊了。为了解决这个问题,uinavigationController为每个uiviewController生成一个uinavigationBarItem,通过这个uinavigationBarItem可以改变控制台“上面”得按钮和标题。如果你不自定义uinavigationBarItem,uinavigationController会使用默认的。

  • l

UINavigationController是UIViewController的子类,UINavigationBar是UIView的子类。

UINavigationBar是UINavigationController的一个组成部分,就是上面的那个导航栏。

UINavigationBar又有UINavigationItem组成。

UINavigationItem则有title,按钮,提示文本等组成,就是我们看到的title文字,右上角的按钮。

  • l   navigation item在navigation Bar代表一个viewController,具体一点儿来说就是每一个加到navigationController的viewController都会有一个对应的navigationItem
  • l   一个导航控制器控制多个视图,NavigationBar上的leftItem,rightItem,title是由当前的视图控制器控制的

所有参考:

UINavigationController使用详解  写的不错  http://www.cnblogs.com/smileEvday/archive/2012/05/14/2495153.html

UINavigationController使用的一些技巧  讲的不错

UINavigationController,UINavigationBar  全面但 凌乱

UINavigationController    讲的比较直白

IOS开发笔记_3.UINavigationController层次关系   绝对牛b清晰

实践经验

1、self.navigationItem.leftBarButtonItem如何自定义位置:右移

方案:

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, ITEM_WIDTH, ITEM_HEIGHT)];
[btn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
[btn setImage:[UIImage imageNamed:@"naviationbar_button_normal.png" ] forState:UIControlStateNormal];//不要用setbackgroudimage
[btn setImage:[UIImage imageNamed:@"naviationbar_button_pressed.png" ] forState:UIControlStateHighlighted];
btn.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0); //方案
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
self.navigationItem.leftBarButtonItem = backItem;

来源:http://bbs.csdn.net/topics/390609070

2、隐藏 TabBar 的方法1(推荐)

如在A_VC中,push B_VC, 则在B_VC中写如下代码

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; self.tabBarController.tabBar.hidden = YES; //隐藏TabBar
[self.navigationItem setHidesBackButton:YES]; //隐藏NavigationController自动生成的返回按钮
self.navigationController.navigationBar.tintColor = [UIColor clearColor]; //返回按钮颜色 }

隐藏 TabBar 的方法2

在A_VC中中写如下代码

-(IBAction)btnOnClicked:(id)sender
{
A_VC *a_VC = [[[A_VC alloc]init]autorelease];
self.hidesBottomBarWhenPushed = YES; //用于隐藏tabBar
[self.navigationController pushViewController:a_VC animated:YES];
self.hidesBottomBarWhenPushed = NO;
}

来源:http://www.cnblogs.com/ygm900/p/3659619.html

如果对你有帮助,请关注我哦!

UI第六节——UINavigationController 详解的更多相关文章

  1. UI第十六节——UITabBarController详解

    一.UITabBarController主要用来管理你提供的content view controllers,而每一个 content view controller则负责管理自己的view层级关系, ...

  2. UI第七节——UISlider详解

    - (void)viewDidLoad { [super viewDidLoad]; // 实例化UISlider,高度对外观没有影响 UISlider *slider = [[UISlider al ...

  3. UI第四节——UIImageView详解

    - (void)viewDidLoad { // super调用是必须的 [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@&quo ...

  4. HTTP协议 (六) 状态码详解

    HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果 ...

  5. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

  6. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  7. C++11 并发指南六( <atomic> 类型详解二 std::atomic )

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)  一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...

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

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

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

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

随机推荐

  1. linux系统安装jdk

    OpenJdk8安装: sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openj ...

  2. Oracle 子查询

    1.子查询在SELECT.UPDATE.DELETE语句内部可以出现SELECT语句.内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表.子查询的类型有: ① 单 ...

  3. Visual Studio 2013小技巧

    Ctrl + F10 可以直接运行到光标处,而不用F10 逐过程 F11 逐语句了 当有多个断点时,按F5可以切换到下一个断点.

  4. Docker探索系列1之docker入门安装与操作

    preface docker这种时髦的技术我接触的比较晚,如果不是公司在使用这项技术,估计还得会更晚接触.好了,说下我司现在docker使用的情况.docker在我司是用来跑web服务的,里面的web ...

  5. w3m常用快捷键

    H    显示帮助 q    退出,会有提示的 j,k,l,h  移动光标 J/K   向下/向上滚屏 T     打开一个新标签页 Esc-t 打开所有标签页,供你选择,使用jk来上下移动 U    ...

  6. 添加css的方式:link与@import区别

    如何在html中添加css? 在html中设置css共有三种方式,分别是: 行内式 内嵌式 导入式-link 导入式-@import 1.行内式.即在html标签中的style属性中设置css,值得注 ...

  7. Python 数据处理----对定长数据的处理

    场景: 有时候我们对大量数据进行处理,对性能要求很高,而且数据都是定长的,比如对移动信息登记表进行处理:名字 身份证信息 手机号码 这些都是定长的,今天小花来教大家如何对此类数据进行处理. 步骤一: ...

  8. Nginx个人简单理解

    首先我们来补充下一些基本知识: 什么是代理服务器? 先举个简单的例子,现在我们在百度访问谷歌的网站,发现现在进不去,这个时候我们可以FQ(关于FQ,可以借鉴下这个博文:http://zhangge.n ...

  9. base64 json

    javascript将base64编码的图片数据转换为file并提交 直接提交base64编码图片数据,过大的话后台会出现转发错误问题. 一个不错的解决方式就是将base64编码的图片数据转换为Blo ...

  10. HTML学习笔记——CSS初涉

    1>嵌入式css写法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...