通过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)
}
通过json动态创建控制器的更多相关文章
- UI进阶之--网易彩票手写plist文件,动态创建控制器与tableViewcell
点击右上角设置按钮 点击按钮后发生的事件:1. 控制器的跳转,进入新的控制器.view, 2. 跳转的时候对将要跳转的目标控制的子控件进行了布局.---通过手写plist文件的方式加载 为按钮注册单击 ...
- 基于 el-form 封装一个依赖 json 动态渲染的表单控件
nf-form 表单控件的功能 基于 el-form 封装了一个表单控件,包括表单的子控件. 既然要封装,那么就要完善一些,把能想到的功能都要实现出来,不想留遗憾. 毕竟UI库提供的功能都很强大了,不 ...
- 基于 element-plus 封装一个依赖 json 动态渲染的查询控件
前情回顾 基于 el-form 封装一个依赖 json 动态渲染的表单控件 Vue3 封装第三方组件(一)做一个合格的传声筒 功能 使用 vue3 + element-plus 封装了一个查询控件,专 ...
- 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中
http://blog.csdn.net/mazhaojuan/article/details/8599167 先看一下我要实现的功能界面: 这篇文章主要介绍:后台一般处理程序把从数据库查找的数据,转 ...
- [转]js动态创建json类型
废话少说:json是一个特有的键值对数组类型.既然是数组类型那么我们就可以这样定义 1.先定义数组 var Data = []; 2.理解键值对 对象名:值{ "id": i, & ...
- 初探原生js根据json数据动态创建table
初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...
- 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 ...
- silverlight依据json字符串动态创建实体类
1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json); ...
- 用Servlet返回JSON文本动态创建DataGrid
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...
随机推荐
- Mysql数据库服务端的安装
一般提到Mysql数据库的安装在工作当中是说的安装数据库管理软件的服务端,服务端的安装可以安装在Windows环境,也可以安装在Linux环境. Windows环境安装:目前安装比较流行的是5.7,增 ...
- Linux磁盘实用指令
磁盘情况查询 df/du 查询磁盘整体占用情况 df 指令:df -h 查询目录磁盘占用情况 du 基本语法 指令:du [选项] 指定目录 常用选项 指定目录不填则默认当前目录 选项 功能 -s 指 ...
- .net core集成使用consul
快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...
- Git 标签使用详解
列出标签 # 默认按字母排序显示 $ git tag # 模糊匹配查找标签 $ git tag -l "v1.8.5*" 创建标签 # 创建附注标签 $ git tag -a v1 ...
- [ flask ] 解耦models(解决models文件太臃肿的问题)
问题描述 用博客项目来描述,我们在models中定义了用户表(User).文章表(Post).通知表(Notification).等等.随着我们开发的深入,添加的功能越来越多,到后期models文件会 ...
- maven仓库策略
当构建Maven项目时,首先检查pom.xml文件以确定依赖包的下载位置,执行顺序如下: 1.从本地资源库中查找并获得依赖包,如果没有,执行第2步. 2.从Maven默认中央仓库中查找并获得依赖包(h ...
- Zuul的应用
一.介绍 注:Zuul中默认就已经集成了Ribbon负载均衡和Hystix熔断机制.但是所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了. 二.依赖 <dependency ...
- 万级K8s集群背后 etcd 稳定性及性能优化实践
1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...
- kali 2020.4 在安装typecho时,无法连接数据库的问题
问题与环境 linux的环境为 kali 2020.4 php版本为:PHP 7.4.11 安装的typecho版本为:typechov1.0 遇到的问题是:在typecho初始化时,数据库的信息都填 ...
- linux 下安装PostgreSql 并配置远程访问
1.官网下载PostgreSql 安装包 (https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) 我下载的是 9. ...