自定义UITabBarController
- 为什么要自定义UITabBarController类?
- 如果不自定义UITabBarController, 在设置tabBar的时候就需要在AppDelegate.m 文件中写大量代码, 这样的代码扩展性非常差.通过自定义UITabBarController把对tabBar设置的代码封装起来, 在创建tabBar对象的时候就能够根据我们的要求实现需要的功能.AppDelegate不需要管tabBar是怎么实现的, 因此有更好的可扩展性.
- tabBarController切换原理:
- 点击tabBar上按钮,就会把对应的子控制器的view添加上去,把之前的子控制器的view移除
控制器的View是懒加载的:
- OC的懒加载机制
- UIViewController的view,也是懒加载
- 正因为控制器的View是懒加载的,因此设置背景色的时候,就应该在各个界面的控制器中设置, 也就是用到该控制器的时候才会设置颜色,
- 如果在面创建该控制器的时候就设置颜色, 这个时候这个 view 就会被加载了, 在大项目中是很不利的, 非常耗内存, 性能不好
- 一定不要在外界设置控制器的view背景色,一般在viewDidLoad设置背景色
- (UIView *)view { if (_view == nil) { [self loadView]; [self viewDidLoad]; } return _view; }除此之外其他控件也都是懒加载的方式
- 如: Button 中的 Label
- 是否存在 Label 是根据有没有赋值文字
- tabBar 上的按钮内容有对应控制器的 tabBarItem决定
- 如果想通过导航控制器的子控制器去设置, 必须要设置图片
// 添加所有子控制器 // 注意添加的所有子控件的时候不要给 View设置颜色, 属于子控件内部的事情有子控件来做, // 所有空间的 View 都是懒加载的方式, 只有用到才会被加载, 但如果提前给每个子控制器的 View 设置颜色, 则这个 View 就会被加载, - (void)setuUpAllChildrenViewController{ // 精华 CDHEssenceViewController *essenceVc = [[CDHEssenceViewController alloc] init]; [self setUpOneChildViewController:essenceVc image:[UIImage imageNamed:@"tabBar_essence_icon"] selectedImage:[UIImage imageNamed:@"tabBar_essence_click_icon"] title:@"精华"]; // 新帖 CDHNewViewController *newVc = [[CDHNewViewController alloc] init]; [self setUpOneChildViewController:newVc image:[UIImage imageNamed:@"tabBar_new_icon"] selectedImage:[UIImage imageNamed:@"tabBar_new_click_icon"] title:@"新帖"]; // 关注 CDHFriendTrendViewController *FriendVc = [[CDHFriendTrendViewController alloc] init]; [self setUpOneChildViewController:FriendVc image:[UIImage imageNamed:@"tabBar_friendTrends_icon"] selectedImage:[UIImage imageNamed:@"tabBar_friendTrends_click_icon"] title:@"关注"]; // 我 CDHMeViewController *meVc = [[CDHMeViewController alloc] init]; [self setUpOneChildViewController:meVc image:[UIImage imageNamed:@"tabBar_me_icon"] selectedImage:[UIImage imageNamed:@"tabBar_me_click_icon"] title:@"我"]; } #pragma mark - 添加一个子控制器 - (void)setUpOneChildViewController:(UIViewController *)vc image:(UIImage *)image selectedImage:(UIImage *)selectedImage title:(NSString *)title{ // 设置 tabBar 标题 vc.tabBarItem.title = title; // 设置 tabBar 图片 vc.tabBarItem.image = image; // 设置 tabBar 被选中的图片 vc.tabBarItem.selectedImage = selectedImage; CDHNavigationController *nav = [[CDHNavigationController alloc] initWithRootViewController:vc]; [self addChildViewController:nav]; }- 如: Button 中的 Label