美文网首页
iOS剖析UINavigationController(二)Ba

iOS剖析UINavigationController(二)Ba

作者: 举个栗子wow | 来源:发表于2017-05-26 16:46 被阅读93次

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

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

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

    24CEFDCC-2B6A-4C3E-A604-48DE92CC4022.png

    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产生的背景色,这点在文档中写的很明确:

    C83CEAC0-C27F-4B5D-8A12-0DF9C4E52FBF.png

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

    相关文章

      网友评论

          本文标题:iOS剖析UINavigationController(二)Ba

          本文链接:https://www.haomeiwen.com/subject/inibxxtx.html