一般导航控制器含有4个对象,UINavigationController、UINavigationBar、UIViewController、UINavigationItem;
NavigationItem存放在UINavigationBar上。由下图我们可以知道一个导航控制器控制着多个视图,一个视图控制器控制一个UINavigationItem
重点看一下,self.navigationItem.leftBarButtonItem这句话,这句话就表明了层次关系,Item是由当前视图控制器的navigationItem控制的,如果写成self.navigationController.navigationItem.leftBarButtonItem 则行不通,这就相当于给每一个视图控制器都加上了leftItem,这违反了我们的初衷!
虽说UINavigationItem是属有当前的ViewController所拥有。但是UINavigationItem也是放在UINavigationBar上面的所管理着。所以我们也还是可以通过UINavigationBar的来访问到UINavigationItem。也就是UINavigationBar.backItem和UINavigation.topItem。对应于图上。对于其他的UINavigationItem,若想通过UINavigationBar访问。也可以通过UINavigationBar.Items[0]访问。(一个ViewController只有唯一的一个UINavigationItem。)
如下图。输出的结果都是HelloWorld.
但不建议通过这种方式。直接通过UINavigationItem最好。
Ø UINavigationItem部分
UINavigationController会为每一个入栈的UIViewController生成一个UINavigationItem. UIViewController通过修改UINavigationItem可以控制UINavigationBar上的按钮和标题等。如下:
Ø UINavigationBar 部分
切记,UINavigationBar只有一个,它永远只属于UINavigationController,是所有UIViewController公用的。所以,当你修改了UINavigationBar的背景图片或者颜色时,相当于修改了所有UIViewController的NavigationBar的背景图片或颜色。
Ø uinavigationController、uinavigationBar、uinavigationBarItem三者的区别,现在明白了吗?
通俗地说就是,uinavigationController是个容器,里面可以装很多uiviewController。装这么多uiviewController让用户怎么控制它们呢,总得有个工具吧。这个工具就是uinavigationBar。一个容器就这么一个bar,相当于控制台吧。但是,管理那么多uiviewController,控制台上得按钮啊、标题啊,都千篇一律是不是看起来太无聊了。为了解决这个问题,uinavigationController为每个uiviewController生成一个uinavigationBarItem,通过这个uinavigationBarItem可以改变控制台“上面”得按钮和标题。如果你不自定义uinavigationBarItem,uinavigationController会使用默认的。
在纯代码操作UINavigationBar和UINavigationItem的实例中,我们会觉得不舒服,或者说疑惑的地方。
事实上,UINavigationController并没有navigationItem这样一个直接的属性,由于UINavigationController继承于UIViewController,而UIViewController是有navigationItem这个属性的,所以才会出现如图所示的情况,如果你这样用:
结果并不会出现——False HelloWorld。
而是:
从苹果的文档中的源码中也可以看出这一点:
UINavigationItem是UIViewController的一个属性。
Ø UINavigationController还有一个属性是ToolBar
ToolBar的用法和NavigationBar的用法类似,只不过ToolBar是用数组来管理的,这个很重要,并且默认是隐藏的,要使用的话记得要设置会打开。
最后是一些简单的使用方法:
1. tinColor改变的是UIBarButtonItem的字体的颜色。无法改变UINavigationItem.title的字体的颜色。如图;
2. backgroundColor虽然也是改变NavigationBar的背景颜色。但是会有浅透明的效果。要使用barTinColor
效果对比如下:
3. 要改变中间的title的属性。请使用标题文本属性(titleTextAttributes)
如图: