2018-01-23 利用反射机制创建控制器

2018-01-24  本文已影响13人  竹杖实验室

我们在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
上一篇 下一篇

猜你喜欢

热点阅读