Seift 动态初始化项目的控制器

Seift 动态初始化项目的控制器_第1张图片
Swift.png

我们在编程的过程中一搬框架的控制器都是固定,一般都是 用TabBarController管理4个或者更多 Nav(导航控制器),用Nav管理子控制器。

  • 问题
    假如有一个需要是, 原来是 4个控制器的,现在有产品 提出 需要3个,多余的一个不要,要如何做呢,

    • 解决方法 是修改代码,去除一个控制器,重新提交一个版本
      <# 这样的办法是不是有耗时呢 #>。
    • 解决方法2:和后台协商好控制器的个数,由他们返回一个 json数据 来控制, 这里所说的个数包括 数量 和 要显示的控制器的名称
  • 实现如下

    • 假设返回的数据如下图所示,


      Seift 动态初始化项目的控制器_第2张图片
      1.jpg
  • 注意:你创建的控制器名称 必须和json返回的数据的控制器名称是一一对应的

    • 搭建界面

 //1.获取路径
        
        guard let  path = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else {
            
            return;
        }
        
        guard let jsonData = NSData(contentsOfFile:path) else {
            
            return;
        }

  //在调用的方法时 最后有一个throws时,该方法会跑出异常
        
        guard let anyObject = try? JSONSerialization.jsonObject(with:jsonData as Data, options: .mutableContainers) else {
            
            return;
        }
        
        
        guard let dicArray =  anyObject as? [[String:Any]] else {
            
            
            return;
        }
        
  for dict in dicArray {
            
            guard let title = dict["title"] as? String else {
                continue
            }
            
            print(title);
            guard let vcName = dict["vcName"] as? String else {
                continue
            }
            
            guard let imageName = dict["imageName"] as? String else {
                continue
            }
            
            // 方法重载 注意
           addChildViewController(childVcName: vcName, title: title, imageName: imageName);
        }
        

//写一个类扩展
extension CCTabBarVC {
  private func addChildViewController(childVcName: String, title : String, imageName : String) {
        
        // 0.获取命名空间
        guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
            print("有没有")
            return
        }
        
        // 1.根据字符串获取对应的Class
        guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {
           
            return
        }
        
        // 2.将对应的AnyObject转成控制器的类型
        guard let childVcType = ChildVcClass as? UIViewController.Type else {
   
            return
        }
        
        // 3.创建对应的控制器对象
        let childVc = childVcType.init()
        
        // 4.设置子控制器的属性
        childVc.title = title
        childVc.tabBarItem.image = UIImage(named: imageName)
        childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
        
        // 5.包装导航栏控制器
        let childNav = UINavigationController(rootViewController: childVc)
        
        // 6.添加控制器
        addChildViewController(childNav);
    }
}


你可能感兴趣的:(Seift 动态初始化项目的控制器)