self.navigationController.navigationItem 与 self.navigationItem 关系对比与分析

原创 2015年11月19日 18:56:19

http://blog.csdn.net/luoyeffcs/article/details/16106707

以下两者对比

    self.navigationController.navigationItem = customItem;

    self.navigationItem = customItem;

我们都知道navigationItem是UIViewController的一个属性,这个属性是为 UINavigationController服务的。文档中是这么解释的“The navigation item used to represent the view controller in a parent’s navigation bar. (read-only)”,即navigation item在navigation Bar代表一个viewController,具体一点儿来说就是每一个加到navigationController的viewController都会有一个对应的navigationItem,该对象由viewController以懒加载的方式创建,稍后我们可以在对象中堆 navigationItem进行配置,可以设置leftBarButtonItem, rightBarButtonItem, backBarButtonItem, title以及prompt等属性。前三个每一个都是一个UIBarButtonItem对象,最后两个属性是一个NSString类型描述,注意添加该描述以后NavigationBar的高度会增加30,总的高度会变成74(不管当前方向是Portrait还是Landscape,此模式下 navgationbar都使用高度44加上prompt30的方式进行显示)。当然如果觉得只是设置文字的title不够爽,你还可以通过 titleview属性指定一个定制的titleview,这样你就可以随心所欲了,当然注意指定的titleview的frame大小,不要显示出界。

1.关系分析

2.关系综述

3.概念点

4.疑问


1.关系分析

UIBarItem-> UIBarButtonItem -> UINavigationItem

1.1 UIBarItem:

UIBarItem类是一个可以放置在Bar之上的所有小控件类的抽象类。继承了该基类所有子类在外观上类似于一个Button,它们都有一个标题,图片,动作以及目标,这点可以从其子类的初始化方法处看到。


1.2 UIBarButtonItem:

专门用来放在UIToolbar 或者 UINavigationBar的特殊button.基本行为跟button是一样的。另外从IOS5开始的Customizing Appearance 增加了一系列的方法调整显示。


1.3 UINavigationItem: NSObject  

(包含了当前页面导航栏上需要显示的全部信息)

title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem


1.4 UINavigationBar :UIView

NavigaitonBar就是导航栏,位于屏幕的上方,管理整个NavigationControllernavigationItem,即类似navigationcontroller一样提供了一个栈来管理item


1.5 UINavigtionController :UIViewController

包含:viewcontrollersnavigationbartoolbar


1.6 navigationbarUIView

包含:items(UINavigationItem)


1.7 viewController

包含navigationitemtoolItem.  这两个属性控制了当前页面当前页面的navigationbartoolbar的外观。


2.关系综述

navigationcontroller直接控制viewcontrollers,然后包含的navigationbar形成整个nv的导航栏,bar并包含整个navigationItem的栈,管理整个nvnavigationitem NSArray *items 属性)。

navigationItem包含了bar视图的全部元素(如title,tileview,backBarButtonItem等),受当前viewcontroller管理,即bar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理。即设置当前页面的左右barbutton,用 self.navigationItem.leftBarButtonItem等。


3.概念点

3.1 

UINavigationController 是一个viewController

UINavigationBar 是一个view

UINavigationItem 是一个NSObject

UIBarButtonItem 是一个 UIBarItem,是一种专门放在bar上的特殊button

UIBarItem是一个NSObject,是是各种itme的父类


3.2 title

self.navigationItem.title,self.tabBarItem.title,self.title关系:

由于view controller本身包含navigationItemtabBarItem,所以可以单独对其title赋值,self.title会重写另外两个的值,只是提供的一种便利方法。


3.3 self.navigationItem,self.navigationController.navigationItem

self.navigationItem  是定制当前view 导航栏。根据当前的资料看,self.navigationController.navigationItem 是应该被忽视的属性,navigationcontroller继承与view controller,所以会有这个属性,但没有任何作用。

不过有人说,“They are Different. If you dynamically add UINavigationController, then you use self.navigationController.navigationItem.”但是没有得到验证,这点我也不认可。


3.4 navigationbar 高度 可更改

UINavigationBar *bar = [self.navigationController navigationBar];

    CGFloat navBarHeight = 70.0f;

    CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);

    [bar setFrame:frame];


3.5 navigationbar prompt

prompt 是一个NSString类型描述,注意添加该描述以后NavigationBar的高度会增加30,总的高度会变成74(不管当前方向是Portrait还是Landscape,此模式下navgationbar都使用高度44加上prompt30的方式进行显示)

如:

self.navigationItem.prompt=@"这是什么?";

self.title=@"HAH";



3.6 navigation barinteractivePopGestureRecognizer

navigation bar 可以修改barstyle transulucent,不能直接修改 frame,bounds,alpha等属性。可以通过initWithNavigationBarClass方法指定自己的navigationbar

IOS7 多了interactivePopGestureRecognizer,看资料说 ios7 UINavigationController 自动就加入了手势返回 前提是不能自定义leftBarButtonItem,自定义了leftBarButtonItem手势就失效了,待研究。


4.疑问

4.1控件都继承于uiview,都有tintcolorbackgroundcolor属性,那两者主要有什么区别呢?

4.2UIBarPosition UIBarMetrics 区别?


相关文章推荐

self.navigationItem和self.navigationController.navigationItem的区别?

self.navigationItem和self.navigationController.navigationItem的区别? **********************************...

对NavigationController/Bar/Item、self.navigationItem/self.navigationController.navigationItem区别的理解

(刚学计算机的新手请先百度,学习什么是“栈”。本人简单形容:栈就相当于放在一个地上可以装书本的盒子,放进去的顺序为书本1、2、3,拿出来的顺序则为3、2、1) 每个ViewController只有...

关于NavigationItem.rightBarButtonItem设置

第一种: UIImage *searchimage=[UIImage imageNamed:@"search.png"];     UIBarButtonItem *barbtn=[[UIBa...

设置 self navigationItem backBarButtonItem (补充 以前的一篇转载文章)

转载说明出处:(谢谢) http://blog.csdn.net/a21064346/article/details/8135794 点击打开链接 补充一下 以前转载的一篇文章,里面是别...

有关 在self.navigationItem.titleView 中增加视图的问题

我们通常都是直接这样使用的     NSLog(@"self.navigationItem.titleView= %@",self.navigationItem.titleView);     NS...
  • yohunl
  • yohunl
  • 2013年12月10日 17:03
  • 15156

self.navigationItem.titleView不居中

为什么self.navigationItem.titleView有时候不能居中呢 答一:UINavigationBar automatically centers its titleVi...

iOS有关pop到self.navigationController.viewControllers以外的界面

今天在编写项目时,遇到一个难题,就是pop出栈的问题,现在的场景是这样:如图 ↓ ,而遇到的问题则是当返回到商品详情/订单详情是,固定死的返回到对应额商品包/订单列表页面,那么,如果是从商品包点击pu...

block循环引用的理解和self.navigationController的理解

今天写代码的时候,发现同事写的代码有些难以理解,向同事询问的时候才发现原来现在的demo是他以前做的,出了一点小问题。 像这样的新手代码,由于不理解block,self.channelListVie...

使用MBProgressHUD引发"self.navigationController.view为nil"的血案

首先介绍下开源的第三方库MBProgressHUD 一个很好的实现了加载提示框的第三方demo。广泛用于应用中。 简单看下界面 开源地址:https://github.com/jdg/M...

self.navigationcontroller是nil吗?

有这个疑惑是因为在看别人的代码时遇到的一个疑问。 具体的代码是下面这样的。/** * IoTAbout.m * * Copyright (c) 2014~2015 Xtreme Program...
  • k7arm
  • k7arm
  • 2016年10月09日 22:50
  • 1066
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:self.navigationController.navigationItem 与 self.navigationItem 关系对比与分析
举报原因:
原因补充:

(最多只允许输入30个字)