自定义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];
    }
    


results matching ""

    No results matching ""