美文网首页
2018-01-23 利用反射机制创建控制器

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

作者: 竹杖实验室 | 来源:发表于2018-01-24 09:26 被阅读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

相关文章

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

    我们在tableBar控制器中, 普通青年创建控制器, 步骤是: 首先, 实现一个通用方法setupChildV...

  • 2019-11-18 iOS 反射机制

    可以利用反射机制动态创建类的实例对象。 常用的方法有: NSStringFromSelector(SEL sele...

  • Spring

    反射 给定一个类的名字(字符串形式),怎么创建该类的对象? 利用Class类构造实例 什么是反射机制? Java反...

  • 用静态工厂来封装retrofit

    用静态工厂来封装retrofit 利用反射机制和静态工厂模式,对retrofit进行简单的封装 利用反射机制,动态...

  • RDD和DataFrame转换

    利用反射机制推断RDD 在利用反射机制推断RDD模式时,需要首先定义一个case class,因为,只有case ...

  • Java学习day-23:反射机制

    一、反射机制_Class对象获取: 1.反射机制: 反射机制是java的动态性之一;一个类被加载后,JVM 会创建...

  • 反射机制

    反射机制用于创建类对象比较难的时候,但又必须去创建的对象 因此使用反射机制去创建类的详细信息 创建类的详细信息的方...

  • Java动态代理

    原理 利用反射机制在运行时创建代理类反射:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任...

  • 反射机制原理的深度理解2017-12-26

    首先我们编写person.java文件如下: 然后创建测试反射机制的类 原理解析: 要理解反射机制的实现过程,首先...

  • 注解 - 反射,运行时动态获取注解信息

    反射 什么是反射? 反射:是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等...

网友评论

      本文标题:2018-01-23 利用反射机制创建控制器

      本文链接:https://www.haomeiwen.com/subject/jxpyaxtx.html