我们要讨论的就是如下的关系:(self指一个vc)
self.navigationController.navigationBar
self.navigationController.navigationItem
self.navigationItem
以上三个第二个也就是self.navigationController.navigationItem
没有太大意义。那它为什么会存在呢?
我们点进去可以看到:
navigationItem是UIViewController对象的一个属性,而UINavigationController继承自UIViewController所以它携带了这个属性,但实际上并没有什么用。
我们来做个小验证,用一个UINavigationController管理若干个VC,打印出每个VC中的
self.navigationController.navigationBar
self.navigationController.navigationItem
self.navigationItem
1C4E1621-46AA-4212-A051-83E01C315BCB.png
打印结果如下,整理了log去掉了无关内容:(3级)
TextUINavigationController[69621:34237109]
我是第0个控制器,
我的navigationBar是<UINavigationBar: 0x7feb21613a80;
我的navigationController的Item为<<UINavigationItem: 0x6000001c8bb0>: title:'(null)'>,
我自身的Item为<<UINavigationItem: 0x6080001c7bc0>: title:'我是标题'>
TextUINavigationController[69621:34237109]
我是第1个控制器,
我的navigationBar是<UINavigationBar: 0x7feb21613a80;
我的navigationController的Item为<<UINavigationItem: 0x6000001c8bb0>: title:'(null)'>,
我自身的Item为<<UINavigationItem: 0x6080001c7f80>: title:'我是标题'>
TextUINavigationController[69621:34237109]
我是第2个控制器,
我的navigationBar是<UINavigationBar: 0x7feb21613a80;
我的navigationController的Item为<<UINavigationItem: 0x6000001c8bb0>: title:'(null)'>,
我自身的Item为<<UINavigationItem: 0x6080001c6900>: 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产生的背景色,这点在文档中写的很明确:
这一篇主要分析bar和两个item的关系,并没有过多地列举属性的设置,我觉得从最根本的入手明白了之后其它的会融会贯通。
网友评论