通过字符串来创建控制器

  • 如果通过字符串来创建控制器

    • 不可以直接通过类型来获取对应的类
    • 因为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) }

转载于:https://www.cnblogs.com/xufengyuan/p/7414147.html

通过json动态创建控制器相关推荐

  1. 用jquery根据json动态创建多级菜单导航(by https://www.cnblogs.com/fatty-yu/p/7088955.html)...

    HTML结构: <section class="sidebar"></setion> json: 1 { 2 "liClass": &q ...

  2. 基于 element-plus 封装一个依赖 json 动态渲染的查询控件

    前情回顾 优惠券网站 m.cps3.cn 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element- ...

  3. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  4. FineUIMvc随笔(1)动态创建表格列

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. <FineUIMvc随笔>目录 FineUIMvc随笔(1)动态创建表格列 FineUIMvc随笔(2)怎样在控件中 ...

  5. java 动态创建实例_java – 有没有办法动态创建类(而不是实例)?

    我有一个关于如何动态创建类(而不是实例)的问题. 在我的项目中,我需要根据配置文件编写几个类似的类. 例如,有一个像这样的 JSON: { { "lang": "pyth ...

  6. kibana创建es索引_java操作es动态创建索引(按月生成),索引类型,索引别名

    第一步:判断索引是否存在: //判断索引是否已经存在String indexName = Constans.ES_INDEX_TIME+"_"+DateUtils.getDateS ...

  7. 利用javascript动态创建表格

    //说明:实现功能.原理上文相同.不过这次是利用已有的简单的方法创建行和列,并实现内容行鼠标移入变色功能! 效果图: /*两个方法 1.  trNode  table.insertRow(-1)    ...

  8. QML 中如何动态创建组件

    作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 在使用 Qt Quick 开发的过程中,有时我们会遇到这样的需求,界面窗口显示出来后,某些 Ite ...

  9. C#表达式目录树系列之5 –动态创建查询表达式

    概要 在项目开发中,根据用户的需求,一般来是,我们的查询表达式是固定的,新的查询需求都要通过代码的修改来实现.而对于不确定的查询条件,固定查询表达式的方式显然是行不通的. 针对固定查询表达式存在的问题 ...

最新文章

  1. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
  2. 特斯拉员工自曝:为应付产能不惜偷工减料,出厂测试得过且过
  3. python优先级排序_Python实现优先级队列结构的方法详解
  4. 前端知识:如何创建自己的Iconfont图标库
  5. Toast与Snackbar的那点事
  6. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
  7. powershell写mysql_使用Powershell对MySql运行MySql存储过程脚本
  8. 如何从JQuery中的each()函数中断/退出? [重复]
  9. 汽车故障检测软件_检测认证事业部软件测评公司党支部与汽车测评管理中心党支部开展党建共建活动...
  10. Vue3开发教程(全)
  11. 麻省理工18年春软件构造课程阅读06“规格说明”
  12. 关于一些常见的矢量格式图(SVG,EPS,wmf,emf)
  13. C#语言对AutoCAD二次开发(二)
  14. Android 中的 ClassLoader 摘抄笔记
  15. 全自动过滤器:全自动自清洗过滤器对给排水总结的经验
  16. DAS Over FC 技术允许 ATTO 分解存储并完成 vSAN 认证套件
  17. ASP.NET MVC身份认证与授权
  18. 采集微信公众号数据的思路
  19. 硕盟 HDMI转VGA 笔记本台式主机HDMI转VGA显示器转接头
  20. 同济大学软件学院万院长谈择业(转载)

热门文章

  1. stata基本操作(二)
  2. 自学前端,需要学习哪些知识点?学多久可以入职前端工程师?
  3. 房产估值软件测试怎么报风险,基于风险的测试策略
  4. python输出文本内容_python如何输出文件内容
  5. 搭配android环境,Android Studio环境搭配所用到的工具和配置
  6. 经济学python值得学吗_地藏经注音,地藏经全文,地藏经全文(注音版)——学佛网...
  7. 将Maven集成到idea中并创建第一个Maven项目
  8. HDU-1251-统计难题(字典树)
  9. (零)ubuntu下制作最小deb包
  10. 配置web工程的过程