通过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)
}