//
// MainViewController.swift
import UIKit
class MainViewController: UITabBarController {
override func viewDidLoad()
{
super.viewDidLoad()
// 0.设置当前控制器对应的tabBar的颜色
tabBar.tintColor = UIColor.orangeColor()
// 1.从json数据创建控制器
// 注意:我们这里是从本地加载的json数据,实际开发一般是从服务器端获取
let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
if let jsonPath = path
{
let jsonData = NSData(contentsOfFile: jsonPath)
do{
// 有可能发生异常的代码放到这里
// try 发生异常会跳到catch中继续执行
// try! 发生异常程序会直接崩溃
let dictArr = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers)
// 遍历数组
// 在Swift中,遍历一个数组,必须明确数据的类型
for dict in dictArr as! [[String:String]] {
// addChildViewController参数必须有值,但是字典的返回值是可选类型
// 所以要加 !号
addChildViewController(dict["vcName"]!, title: dict["title"]!, imageName: dict["imageName"]!)
}
}catch{
// 发生异常之后执行的代码
// 从本地创建控制
addChildViewController("HomeTableViewController", title: "首页", imageName: "tabbar_home")
addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center")
addChildViewController("DiscoverTableViewController", title: "广场", imageName: "tabbar_discover")
addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile")
}
}
}
/**
初始化子控制器
- parameter childControllerName: 需要初始化的子控制器名称
- parameter title: 子控制器的标题
- parameter imageName: 子控制器的图片
*/
private func addChildViewController(childControllerName: String, title:String, imageName:String)
{
// 0.动态获取命名空间
// 默认情况下命名控件就是项目的名称(注意项目名称不要有中横线,如"Swift-weibo")
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
// 将字符串转换为类
let cls:AnyClass? = NSClassFromString(namespace + "." + childControllerName)
// 将AnyClass转为指定的类型
let vcCls = cls as! UIViewController.Type
// 通过class创建对象
let vc = vcCls.init()
// 1.设置子控制器对应的数据
vc.tabBarItem.image = UIImage(named: imageName)
vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
vc.title = title
// 2.给子控制器包装一个导航控制器
let nav = UINavigationController()
nav.addChildViewController(vc)
// 2.将导航控制器添加到当前控制器上
addChildViewController(nav)
}
}
json数据:
[
{
"vcName": "HomeTableViewController",
"title": "首页",
"imageName": "tabbar_home"
},
{
"vcName": "MessageTableViewController",
"title": "消息",
"imageName": "tabbar_message_center"
},
{
"vcName": "DiscoverTableViewController",
"title": "广场",
"imageName": "tabbar_discover"
},
{
"vcName": "ProfileTableViewController",
"title": "我",
"imageName": "tabbar_profile"
}
]