zoukankan      html  css  js  c++  java
  • 通过json动态创建控制器

    通过字符串来创建控制器

    • 如果通过字符串来创建控制器
      • 不可以直接通过类型来获取对应的类
      • 因为Swift有命名空间,类前需要加上命名空间的名称
    • 获取命名空间的名称
    let executable = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String
    
    • 通过字符串创建对象
      • 获取类的名称
      • 获取类的真实类型
      • 创建对应类的对象
        // 1.获取对应的类
        guard let childVcClass : AnyClass = NSClassFromString(executable + "." + childCVcName) else {
            XMGLog("转成对应的类失败")
            return
        }
    
        // 2.拿到对应的类
        let childClass = childVcClass as! UITableViewController.Type
        let childVc = childClass.init()
    
    • 完整代码
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // 添加自控制器
            self.addChildViewController("HomeViewController", imageName: "tabbar_home", title: "主页")
            self.addChildViewController("MessageViewController", imageName: "tabbar_message_center", title: "消息")
            self.addChildViewController("DiscoverViewController", imageName: "tabbar_discover", title: "广场")
            self.addChildViewController("ProfileViewController", imageName: "tabbar_profile", title: "我")
        }
    
        private func addChildViewController(childCVcName: String, imageName : String, title : String) {
    
            // 0.获取命名空间
            guard let executable = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String else {
                XMGLog("没有命名空间")
                return
            }
    
            // 1.获取对应的类
            guard let childVcClass : AnyClass = NSClassFromString(executable + "." + childCVcName) else {
                XMGLog("转成对应的类失败")
                return
            }
    
            // 2.拿到对应的类
            let childClass = childVcClass as! UITableViewController.Type
            let childVc = childClass.init()
    
            // 3.创建自控制器
            let homeNav = UINavigationController(rootViewController: childVc)
    
            // 4.设置标题
            childVc.title = title
            childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
            childVc.tabBarItem.image = UIImage(named: imageName)
    
            // 5.添加到UITabbarController
            self.addChildViewController(homeNav)
        }
    }
    

    读取json文件.创建对应的控制器

    • 读取json文件
      • 从服务器获取json文件(本地)
      • 加载对应的json文件
      • 通过序列化转成对应的类型
           // 1.1.获取路径
        let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
        // 1.2.加载数据
        guard let data = NSData(contentsOfFile: path!) else {
            XMGLog("没有获取到json数据")
            addChildViewController()
            return
        }
    
        // 1.3.通过序列化获取内容
        guard let childVcArray = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [[String : AnyObject]] else {
            print("没有获取到值")
            addChildViewController()
            return
        }
    
    • 注意:JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions)函数会抛出异常
      • 如果发现在调用一个方法时,会出现throws.则需要处理异常
      • 处理异常三种方式
        • try方式
        • try?方式
        • try!方式
        处理异常三种方式
        1.try方式
        do {
        let childVcArray = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
        } catch {
        // 如果有错误,则错误会放到一个变量:error中
        XMGLog(error)
        }
        2.try?方式
        如果有值,则返回对应的值.如果没有值,则返回nil.
        也就是:返回的类型时一个可选类型
        3.try!方式:不建议使用
        相当于告诉系统一定没有异常,该方式非常危险.很容易崩溃
    
    • 完整代码
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // 1.加载json中的数据
            // 1.1.获取路径
            let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
            // 1.2.加载数据
            guard let data = NSData(contentsOfFile: path!) else {
                XMGLog("没有获取到json数据")
                addChildViewController()
                return
            }
    
            // 1.3.通过序列化获取内容
            guard let childVcArray = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [[String : AnyObject]] else {
                print("没有获取到值")
                addChildViewController()
                return
            }
    
            // 1.4.遍历数组,并且创建控制器
            for dict in childVcArray {
                // 1.取出类名称
                let vcName = dict["vcName"] as! String
    
                // 2.取出标题
                let title = dict["title"] as! String
    
                // 3.取出图标名称
                let imageName = dict["imageName"] as! String
    
                // 4.创建控制器
                addChildViewController(vcName, imageName: imageName, title: title)
            }
        }
    
        private func addChildViewController() {
            self.addChildViewController("HomeViewController", imageName: "tabbar_home", title: "主页")
            self.addChildViewController("MessageViewController", imageName: "tabbar_message_center", title: "消息")
            self.addChildViewController("DiscoverViewController", imageName: "tabbar_discover", title: "广场")
            self.addChildViewController("ProfileViewController", imageName: "tabbar_profile", title: "我")
        }
    
        private func addChildViewController(childCVcName: String, imageName : String, title : String) {
    
            // 0.获取命名空间
            guard let executable = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String else {
                XMGLog("没有命名空间")
                return
            }
    
            // 1.获取对应的类
            guard let childVcClass : AnyClass = NSClassFromString(executable + "." + childCVcName) else {
                XMGLog("转成对应的类失败")
                return
            }
    
            // 2.拿到对应的类
            let childClass = childVcClass as! UITableViewController.Type
            let childVc = childClass.init()
    
            // 3.创建自控制器
            let homeNav = UINavigationController(rootViewController: childVc)
    
            // 4.设置标题
            childVc.title = title
            childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
            childVc.tabBarItem.image = UIImage(named: imageName)
    
            // 5.添加到UITabbarController
            self.addChildViewController(homeNav)
        }
  • 相关阅读:
    Git(一):基础调用
    Vue(一):使用Vue创建项目并发布
    mysql用户与权限
    跨域理解及常用解决方案
    Ajax简单用法
    冒泡排序算法
    委托使用方式
    How to: Add the Analyze Action to List Views 如何:将分析按钮添加到列表视图
    How to:Customize Action Controls 如何:自定义按钮控件
    How to: Customize the New Action's Items List 如何:自定义新按钮的项目列表
  • 原文地址:https://www.cnblogs.com/xufengyuan/p/7414147.html
Copyright © 2011-2022 走看看