通过字符串来创建控制器

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

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

通过json动态创建控制器的更多相关文章

  1. UI进阶之--网易彩票手写plist文件,动态创建控制器与tableViewcell

    点击右上角设置按钮 点击按钮后发生的事件:1. 控制器的跳转,进入新的控制器.view, 2. 跳转的时候对将要跳转的目标控制的子控件进行了布局.---通过手写plist文件的方式加载 为按钮注册单击 ...

  2. 基于 el-form 封装一个依赖 json 动态渲染的表单控件

    nf-form 表单控件的功能 基于 el-form 封装了一个表单控件,包括表单的子控件. 既然要封装,那么就要完善一些,把能想到的功能都要实现出来,不想留遗憾. 毕竟UI库提供的功能都很强大了,不 ...

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

    前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...

  4. 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中

    http://blog.csdn.net/mazhaojuan/article/details/8599167 先看一下我要实现的功能界面: 这篇文章主要介绍:后台一般处理程序把从数据库查找的数据,转 ...

  5. [转]js动态创建json类型

    废话少说:json是一个特有的键值对数组类型.既然是数组类型那么我们就可以这样定义 1.先定义数组 var Data = []; 2.理解键值对 对象名:值{ "id": i, & ...

  6. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...

  7. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  8. silverlight依据json字符串动态创建实体类

    1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json);   ...

  9. 用Servlet返回JSON文本动态创建DataGrid

    <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...

随机推荐

  1. Adversarially Robust Generalization Requires More Data

    目录 概 主要内容 高斯模型 upper bound lower bound 伯努利模型 upper bound lower bound Schmidt L, Santurkar S, Tsipras ...

  2. 人脸识别中的重要环节-对齐之3D变换-Java版(文末附开源地址)

    一.人脸对齐基本概念 人脸对齐通过人脸关键点检测得到人脸的关键点坐标,然后根据人脸的关键点坐标调整人脸的角度,使人脸对齐,由于输入图像的尺寸是大小不一的,人脸区域大小也不相同,角度不一样,所以要通过坐 ...

  3. Linux_Cornd任务调度

    Crond任务调度 进行定时任务的设置 概述 任务调度:是指系统在某个时间执行特定的命令或程序 作用:避免重复工作 基本语法 crontab [选项] 选项 功能 -e 编辑crontab定时任务 - ...

  4. Android物联网应用程序开发(智慧城市)—— 用户注册界面开发

    效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: ...

  5. 深入 Laravel 内核之观察者模式

    装饰模式核心内容: 观察者模式又称为发布订阅模式,定义了对象间的一对多依赖关系,当一个对象状态发生改变时,其相关依赖的其他对象都能接收到通知: 观察者模式的核心在于目标(Subject)和观察者(Ob ...

  6. Linux 使用 scp 命令远程拷贝文件和目录

    使用方法: $ scp --help scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o s ...

  7. 使用VUE组件创建SpreadJS自定义单元格(一)

    作为近五年都冲在热门框架排行榜首的Vue,大家一定会学到的一部分就是组件的使用.前端开发的模块化,可以让代码逻辑更加简单清晰,项目的扩展性大大加强.对于Vue而言,模块化的体现集中在组件之上,以组件为 ...

  8. Fiddler Everywhere简单使用

    重装了电脑,想装Fiddler,结果官网下载的包变成了Fiddler Everywhere,体验了下,与老版本相比,操作流程上并无太大变化,但是安装包明显变大了,而且需要登录才能操作,建议还是用老版本 ...

  9. 使用.NET 6开发TodoList应用(26)——实现Configuration和Option的强类型绑定

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在上一篇文章使用.NET 6开发TodoList应用(25)--实现RefreshToken中,我们通过使用Configura ...

  10. echart实现实时疫情图

    直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </h ...