首页 > 其他 > 详细

UINavigationController 层次关系

时间:2017-01-31 12:09:04      阅读:291      评论:0      收藏:0      [点我收藏+]
参考:
http://www.cnblogs.com/ygm900/p/3659619.html
 

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

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

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

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

技术分享

概述:

UINavigationController:是一个ViewController,导航栏控制器,其通过栈来直接控制了其下的viewController。可通过此设置全局导航栏属性。如导航栏背景或title颜色等。子视图会继承这些属性,具体见下面“初始化UINavigationController”

UINavigationBar:是一个View,NavigaitonBar就是导航栏,位于屏幕的上方,管理整个NavigationController的navigationItem,即类似navigationController一样提供了一个栈来管理item。

UINavigationItem:是一个NSObject,一般使用在self.navigationItem, 包含了当前页面导航栏上需要显示的全部信息(
title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem )。其中UIBarButtonItem是一个UIBarItem,是一种专门放在UINavigationBar上的特殊button。
 
UINavigation toolbar: 是tool条,包括image,文字title

简单讲

全局唯一的UINavigationController栈生成全局唯一的UINavigationBar栈,UINavigationController中的每个UIViewController管理UINavigationBar(UINavigationController栈每个UIViewController将自身的属性:navigationItem压入或弹出UINavigationBar)。

 

两个栈——UINavigationControllerUINavigationBar,从层次关系上来说,是一一对应的:

技术分享

上方注释的意思,依个人理解,意思是:UINavigationController中当前活动的视图控制器UIViewController与UINavigationBar栈中当前活动的UINavigationItem一一对应,处于同一层次。

用下图来表示:

顺序一:

技术分享

顺序二:

技术分享

区别:
1.UINavigationBarUINavigationItem
navigationBar包含整个navigationItem的栈,管理整个navigationController的navigationItem( NSArray *items 属性)。
navigationItem包含了bar视图的全部元素(如title,tileview,backBarButtonItem等),受当前viewcontroller管理,即bar形成整个nv的导航视图,然后每个nv页面的导航栏元素由所在页面的navigationItem管理
 
 
2.self.navigationController.navigationItem 与 self.navigationItem

首先,self.navigationItem不难理解,代表当前控制器的UINavigationItem;

 

至于self.navigationController.navigationItem,需要先解释一下,self.navigationController是什么意思——

  1. 可以简单理解为:self.navigationController代表访问全局UINavigationController中的当前活动视图(其实就是控制器自己)。如果当前控制器不处在UINavigationController中,则获取不到navigationController属性(值为nil);  
 
 

概括为——每个UIViewController内部都定义了一个navigationController属性,它代表的是已被压入UINavigationController栈中的当前控制器自身(self)!

 

如果当前控制器未压入栈,self.navigationController=nil;如果控制器已压入栈,self.navigationController=self

现在就可以解答问题了:self.navigationItem、self.navigationController.navigationItem作用一样,但前提必须是此视图控制器已经压入全局的UINavigationController栈中。所以建议最好使用self.navigationItem,防止因当前视图控制器没有压入栈而调用不到控制器自身的navigationItem属性。

可能有人要问,已经有self指针了,那self.navigationController这种设计不是多次一举吗?本人的看法是,它可以用于判断当前控制器是否已被压入栈,以此做出不同响应,比如使用下方代码:

[plain] view plain copy
 
  1. if(self.navigationController)  
  2. {  
  3.     //属性不为nil  
  4.     代码1  
  5. }  
  6. else  
  7. {  
  8.     //属性为nil  
  9.     代码2(比如提示未入栈警告)  
  10. }  
 
3.self.navigationController.tabBarItem 与 self.tabBarItem
和self.navigationController.navigationItem 与 self.navigationItem 的区别基本差不多
 
 

UINavigationController 层次关系

原文:http://www.cnblogs.com/xb-blogs/p/6358711.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!