通过上图,我们能够清楚的区分 UINavigationBar 、UINavigationItem、 UIBarButtonItem、UIToolBar 和 UITabBar 、UITabBarItem。
概述如下:
一、UINavigationItem
1> 获得方式
self.navigationItem // self是指控制器
2> 作用
可以用来设置当前控制器顶部导航栏的内容
// 设置导航栏中间的内容(该中间位置的控件为:UINavigationItemView)
self.navigationItem.title
self.navigationItem.titleView
二、UIBarButtonItem
1> 用在什么地方
// 设置导航栏左上角的内容
self.navigationItem.leftBarButtonItem
// 设置导航栏右上角的内容
self.navigationItem.rightBarButtonItem
备注:leftBarButtonItem 和 rightBarButtonItem 的真实类型是UIBarButtonItem,也相当于模型。(其对应的控件为:UINavigationButton)
2> 作用
相当于一个按钮(真实类型为:UINavigationButton)
三、UITabBarItem
1> 获得方式
self.tabBarItem // self是指控制器
2> 作用
可以用来设置当前控制器对应的选项卡标签的内容
// 标签的标题
self.tabBarItem.title
// 标签的图标
self.tabBarItem.image
// 标签的选中图标
self.tabBarItem.selectdImage
四、UINavigationBar
1. 导航控制器顶部的栏(UI控件)
2. UINavigationBar上面显示什么内容, 取决于当前控制器的navigationItem属性
3. UINavigationBar是view, navigationItem是model
4. 由navigationItem给UINavigationBar提供显示的数据
五、UITabBar
1. UITabBarController底部的选项卡条
六、UITabBarButton(苹果私有的类)
1. UITabBar底部的每一个标签
2. 每一个UITabBarButton里面显示什么内容,取决于当前控制器的tabBarItem属性
3. UITabBarButton是view, tabBarItem是model
4. 由tabBarItem给UITabBarButton提供显示的数据
提示:
(1)self.navigationItem 仅仅能代表导航栏的内容,它不是导航栏,因为它继承自NSObject,所以它不是控件,它仅仅是个模型。
(2)导航栏上显示什么内容,由navigationItem决定,所以从当前控制器切换到另一个控制器时,导航栏的内容就被换掉了,因为navigationItem换掉了,模型数据改了,控件中显示的数据也要跟着改。
(3)有时一个UINavigationBar(导航栏)可能会对应很多个navigationItem模型,具体要看你当前子模块中的控制器的情况,因为每一个控制器都有自己的一个navigationItem属性。而UINavigationBar只属于当前的子模块对应的导航控制器,所以只有一个导航栏。(navigationItem属性是UIViewController的属性)
(4)UITabBar中的每个UITabBarButton控件显示什么内容,由其对应的当前控制器的tabBarItem属性决定的。(tabBarItem属性是UIViewController的属性)。即tabBarItem是设置当前控制器对应的选项卡(即对应的UITabBarButton)中的内容(如 标签的标题、图标、选中图标)。
(5)怎样验证UITabBar 和 UINavigationBar中有哪些控件?
建议在 如下方法中,打印出他们的所有子控件,举例如下:
- (void)viewDidAppear:(BOOL)animated
{
NSLog(@"%@", self.navigationBar.subviews);
// 打印发现:UINavigationBar内部的控件有:UINavigationItemView 用于显示 UINavigationItem 中的数据。
// UINavigationButton 用于显示 leftBarButtonItem 和 rightBarButtonItem 中的数据。
}
注意点:不要在viewDidload中打印验证,因为viewDidload是view刚刚创建完,此时UITabBar 和 UINavigationBar中可能没有内容,所以建议在viewDidAppear中打印,此时的view已经完全显示了,所以更稳妥。