我们在tableBar控制器中, 普通青年创建控制器, 步骤是:
首先, 实现一个通用方法setupChildViewcontroller: andTitle: andImageName: andSelectedImageName:, 这个方法统一管理控制器值的设置.
- (void)setupChildViewcontroller:(UIViewController *)controller andTitle:(NSString *)title andImageName:(NSString *)imageName andSelectedImageName:(NSString *)SelectedImageName{
controller.tabBarItem.image = [[UIImage imageNamed:imageName]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
controller.tabBarItem.selectedImage = [[UIImage imageNamed:SelectedImageName]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UINavigationController *meNav = [[UINavigationController alloc]initWithRootViewController:controller];
[self addChildViewController:meNav];
}
然后, 给相应控制器设置不同的参数.
// 1. 首页
[self setupChildViewcontroller:[[KKHomeViewController alloc]init] andTitle:@"首页" andImageName:@"tabbar_home" andSelectedImageName:@"tabbar_home_selected"];
// 2. 设置
[self setupChildViewcontroller:[[KKSettingViewController alloc]init] andTitle:@"设置" andImageName:@"tabbar_message_center" andSelectedImageName:@"tabbar_message_center_selected"];
// 3. 订单
[self setupChildViewcontroller:[[KKOrderViewController alloc]init] andTitle:@"订单" andImageName:@"tabbar_profile" andSelectedImageName:@"tabbar_profile_selected"];
// 4. 我的
[self setupChildViewcontroller:[[KKMainViewController alloc]init] andTitle:@"我的" andImageName:@"tabbar_discover" andSelectedImageName:@"tabbar_discover_selected"];
这种方法没什么毛病, 但是扩展不够方便. 假如有更多的参数需要配置, 就要扩展这个通用方法, 最终导致这个方法很长, 不够优雅.
利用反射机制, 就可以做到易扩展, 而且后续要配置到plist中也方便, 更进一步需要服务器下发动态配置控制器特性的话, 显然只能用反射机制了. 比如淘宝app, 做各种活动会改成很漂亮的活动图标, 或者控制某些界面是否显示.
实现思路:
设置一个大数组, 数组里放字典, 字典里面用键值对的方式存放每个控制器的具体信息字段.
这样的话, 如果某个控制器需要新增某些特性, 只需要改单独的对应字典既可以.
下面是具体实现:
//
// KKTabBarController.m
// KuarkPay
//
// Created by toxicanty on 2018/1/23.
// Copyright © 2018年 toxicanty. All rights reserved.
@interface KKTabBarController ()
@end
@implementation KKTabBarController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// 初始化所有的子控制器
[self setupChildViewControllers];
}
- (void)setupChildViewControllers{
NSArray *array = @[
@{@"className":@"KKHomeViewController",@"imageName":@"tabbar_home",@"SelectedImageName":@"tabbar_home_selected", @"title":@"首页"},
@{@"className":@"KKSettingViewController",@"imageName":@"tabbar_home",@"SelectedImageName":@"tabbar_home_selected", @"title":@"设置"},
@{@"className":@"KKMainViewController",@"imageName":@"tabbar_home",@"SelectedImageName":@"tabbar_home_selected", @"title":@"订单"},
@{@"className":@"KKOrderViewController",@"imageName":@"tabbar_home",@"SelectedImageName":@"tabbar_home_selected", @"title":@"我的"}
];
NSMutableArray *viewControllers = [[NSMutableArray alloc]initWithCapacity:array.count];
for (NSDictionary *dic in array){
NSLog(@"dic == %@", dic);
Class cls = NSClassFromString([dic objectForKey:@"className"]);
UIViewController *vc = [[cls alloc]init];
vc.title = [dic objectForKey:@"title"];
vc.tabBarItem.image = [UIImage imageNamed:[dic objectForKey:@"imageName"]];
vc.tabBarItem.selectedImage = [UIImage imageNamed:[dic objectForKey:@"SelectedImageName"]];
[viewControllers addObject:vc];
}
if(viewControllers && viewControllers.count){
self.viewControllers = viewControllers;
}
}
@end
网友评论