iOS剖析UINavigationController(二)Bar与Item的关系

我们要讨论的就是如下的关系:(self指一个vc)

self.navigationController.navigationBar
self.navigationController.navigationItem
self.navigationItem

以上三个第二个也就是self.navigationController.navigationItem没有太大意义。那它为什么会存在呢?
我们点进去可以看到:

iOS剖析UINavigationController(二)Bar与Item的关系_第1张图片
24CEFDCC-2B6A-4C3E-A604-48DE92CC4022.png

navigationItem是UIViewController对象的一个属性,而UINavigationController继承自UIViewController所以它携带了这个属性,但实际上并没有什么用。

我们来做个小验证,用一个UINavigationController管理若干个VC,打印出每个VC中的

self.navigationController.navigationBar
self.navigationController.navigationItem
self.navigationItem
iOS剖析UINavigationController(二)Bar与Item的关系_第2张图片
1C4E1621-46AA-4212-A051-83E01C315BCB.png

打印结果如下,整理了log去掉了无关内容:(3级)

TextUINavigationController[69621:34237109]
我是第0个控制器,
我的navigationBar是: title:'(null)'>,
我自身的Item为<: title:'我是标题'>

TextUINavigationController[69621:34237109] 
我是第1个控制器,
我的navigationBar是: title:'(null)'>,
我自身的Item为<: title:'我是标题'>

TextUINavigationController[69621:34237109]
我是第2个控制器,
我的navigationBar是: title:'(null)'>,
我自身的Item为<: title:'我是标题'>

我们可以看self.navigationController.navigationBar和self.navigationController.navigationItem这两个地址一直没有变化,而self.navigationItem却一直在变化。

每个UINavigationController的对象只包含了一个Bar,UINavigationController本身具备的item并没意义,它管理的vc具备的item才有意义(改变的是每一个对应的item)。

Bar相当于一个画板,里面会有一张一张画纸(vc),画什么(item)是由画纸决定的。

由此可见,我们在任何一个子vc下修改Bar都会造成其它子vc的Bar状态改变(同一个Nav管理下);而对于item,每个子VC都可以设置不同的item互相也不会影响。

所以,我们在设置属性的时候是对Bar设置还是对Item设置就比较清晰了。色彩背景样式之类的对Bar设置,文字左右按钮之类的对Item设置。

最后简单说一下BarTintColor。如果我们要修改导航栏颜色的话,从第一篇的层级中我们已经看到了,我们可操作的对象Bar前面还有几层View,所以设置bar.backGroundColor毫无意义。
在7.0之前,我们可以设置tintColor来改变bar产生的背景色,而7.0之后,我们要使用barTintColor来改变bar产生的背景色,这点在文档中写的很明确:

iOS剖析UINavigationController(二)Bar与Item的关系_第3张图片
C83CEAC0-C27F-4B5D-8A12-0DF9C4E52FBF.png

这一篇主要分析bar和两个item的关系,并没有过多地列举属性的设置,我觉得从最根本的入手明白了之后其它的会融会贯通。

你可能感兴趣的:(iOS剖析UINavigationController(二)Bar与Item的关系)