美文网首页Swift开发
Seift 动态初始化项目的控制器

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

作者: 追逐_chase | 来源:发表于2017-12-07 09:52 被阅读8次
    Swift.png

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

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

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

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


        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 动态初始化项目的控制器

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