IOS博客项目搭建-03-代码重构

(一)、需要重构的代码

//
//  IWTabBarViewController.m
//  ItcastWeibo
//
//  Created by kaiyi on 16-1-20.
//  Copyright (c) 2016年 kaiyi. All rights reserved.
//

#import "IWTabBarViewController.h"
#import "IWHomeViewController.h"
#import "IWMessageViewController.h"
#import "IWDiscoverViewController.h"
#import "IWMeViewController.h"

@interface IWTabBarViewController ()

@end

@implementation IWTabBarViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化所有的子控制器(首页,消息,广场,我)每个控制器的内容都不一样,所以每个自控制器实现自己的业务逻辑
    
    // 1.首页
    IWHomeViewController *home = [[IWHomeViewController alloc] init];
    home.view.backgroundColor = [UIColor redColor];    // 自控制器添加背景色
    home.title = @"首页";
    // home.tabBarItem.title = @"首页";
    // home.navigationController.title = @"首页";
    home.tabBarItem.image = [UIImage imageNamed:@"tabbar_home"];
    
    // 选中时的背景图,并且不要渲染返回原来的图片,否则还是原来默认的蓝色背景图
    // UIImage *selectedImg = [UIImage imageNamed:@"tabbar_home_selected"];
    home.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_home_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    // 添加导航控制器
    UINavigationController *homeNav = [[UINavigationController alloc] initWithRootViewController:home];
    [self addChildViewController:homeNav];                // 添加子控制器
    
    
    // 2.消息
    IWMessageViewController *message = [[IWMessageViewController alloc] init];
    message.view.backgroundColor = [UIColor greenColor];    // 自控制器添加背景色
    message.title = @"消息";
    message.tabBarItem.image = [UIImage imageNamed:@"tabbar_message_center"];
    message.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_message_center_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    // 添加导航控制器
    UINavigationController *messageNav = [[UINavigationController alloc] initWithRootViewController:message];
    [self addChildViewController:messageNav];  // 添加子控制器
    

    // 3.发现
    IWDiscoverViewController *discover = [[IWDiscoverViewController alloc] init];
    discover.view.backgroundColor = [UIColor grayColor];    // 自控制器添加背景色
    discover.title = @"广场";
    discover.tabBarItem.image = [UIImage imageNamed:@"tabbar_discover"];
    discover.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_discover_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    // 添加导航控制器
    UINavigationController *discoverNav = [[UINavigationController alloc] initWithRootViewController:discover];
    [self addChildViewController:discoverNav];  // 添加子控制器
    

    // 4.我
    IWMeViewController *me = [[IWMeViewController alloc] init];
    me.view.backgroundColor = [UIColor yellowColor];    // 自控制器添加背景色
    me.title = @"我";
    me.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile"];
    me.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_profile_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    // 添加导航控制器
    UINavigationController *meNav = [[UINavigationController alloc] initWithRootViewController:me];
    [self addChildViewController:meNav];  // 添加子控制器
   
}


@end


二、重构代码

 (1)、将字控制器通用方法,抽成一个通用的方法:

 // 4.我
    IWMeViewController *me = [[IWMeViewController alloc] init];
    me.view.backgroundColor = [UIColor yellowColor];    // 自控制器添加背景色
    me.title = @"我";
    me.tabBarItem.image = [UIImage imageNamed:@"tabbar_profile"];
    me.tabBarItem.selectedImage = [[UIImage imageNamed:@"tabbar_profile_selected"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
     
    // 添加导航控制器
    UINavigationController *meNav = [[UINavigationController alloc] initWithRootViewController:me];
    [self addChildViewController:meNav];  // 添加子控制器

  

 重构成的通用方法:

/**
 *(重构方法)初始化一个子控制器
 *
 * @param childVc            需要初始化的子控制器
 * @param title              标题
 * @param imageName          图标
 * @param selectedImageName  选中的图标
 *
 */
-(void)setupChildViewController:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName
                  selectedImageName:(NSString *)selectedImageName
{
    // 1.设置控制器的一些属性
    childVc.title = title;
    childVc.tabBarItem.image = [UIImage imageNamed:imageName];
    childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
     
    // 2.包装一个导航控制器
    UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:childVc];
    [self addChildViewController:Nav];  // 添加子控制器
     
}


   重构的完整代码示例:

//
//  IWTabBarViewController.m
//  ItcastWeibo
//
//  Created by kaiyi on 16-1-20.
//  Copyright (c) 2016年 kaiyi. All rights reserved.
//

#import "IWTabBarViewController.h"
#import "IWHomeViewController.h"
#import "IWMessageViewController.h"
#import "IWDiscoverViewController.h"
#import "IWMeViewController.h"

@interface IWTabBarViewController ()

@end

@implementation IWTabBarViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 初始化所有的子控制器
    [self setupAllChildViewControllers];
}

// 将所有的初始化自控制器抽出成一个方法,然后在启动时自动调用
-(void)setupAllChildViewControllers
{
    // 初始化所有的子控制器(首页,消息,广场,我)每个控制器的内容都不一样,所以每个自控制器实现自己的业务逻辑
    
    // 1.首页
    IWHomeViewController *home = [[IWHomeViewController alloc] init];
    home.view.backgroundColor = [UIColor redColor];    // 自控制器添加背景色
    
    // 自定义的重构的公共方法
    [self setupChildViewController:home title:@"首页" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"];
    
    
    // 2.消息
    IWMessageViewController *message = [[IWMessageViewController alloc] init];
    message.view.backgroundColor = [UIColor greenColor];    // 自控制器添加背景色
    
    // 自定义的重构的公共方法
    [self setupChildViewController:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"];
    
    // 3.发现
    IWDiscoverViewController *discover = [[IWDiscoverViewController alloc] init];
    discover.view.backgroundColor = [UIColor grayColor];    // 自控制器添加背景色
    
    // 自定义的重构的公共方法
    [self setupChildViewController:discover title:@"广场" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"];
    
    
    // 4.我
    IWMeViewController *me = [[IWMeViewController alloc] init];
    me.view.backgroundColor = [UIColor yellowColor];    // 自控制器添加背景色
    
    [self setupChildViewController:me title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"];

}


/**
 *(重构方法)初始化一个子控制器
 *
 * @param childVc            需要初始化的子控制器
 * @param title              标题
 * @param imageName          图标
 * @param selectedImageName  选中的图标
 *
 */
-(void)setupChildViewController:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName
                  selectedImageName:(NSString *)selectedImageName
{
    // 1.设置控制器的一些属性
    childVc.title = title;
    childVc.tabBarItem.image = [UIImage imageNamed:imageName];
    childVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    // 2.包装一个导航控制器
    UINavigationController *Nav = [[UINavigationController alloc] initWithRootViewController:childVc];
    [self addChildViewController:Nav];  // 添加子控制器
    
}

@end

     重构思路:

                 1:初始化一个子控制器,将每个子控制器中相同的东西,抽出为一个方法,然后将不同的东西作为参数传递给该方法,setupChildViewController,然后在每个子模块中调用该方法。

                  2:将所有子控制器初始化方法,抽出成一个总的初始化方法,然后在view加载时的viewDidLoad中调用该方法setupAllChildViewControllers,这样代码就显得非常简洁。

     我们可以看到,重构后的代码非常简洁明了,各个功能模块非常清楚,所以,这样写代码,不仅工整,有条理,而且以后维护的时候也方便维护,每一个功能模块是一个方法。

你可能感兴趣的:(ios,代码重构,子导航控制器)