(一)、需要重构的代码
// // 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,这样代码就显得非常简洁。
我们可以看到,重构后的代码非常简洁明了,各个功能模块非常清楚,所以,这样写代码,不仅工整,有条理,而且以后维护的时候也方便维护,每一个功能模块是一个方法。