1.创建一个json文件
// MARK: 添加子控制器 private func addChileControllers(){ // 1.获取json文件路径 let path = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) // 2.通过文件路径创建data if let jsonPath = path{ let jsonData = NSData(contentsOfFile: jsonPath) do { // 有可能发生异常的代码放到这里 // 3.序列化json数据 --> Array // try : 发生异常会跳到catch 中继续执行 let dictArr = try JSONSerialization.jsonObject(with: jsonData! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) // 4.遍历数组,动态创建控制器和设置数据 // 在Swift中,如果需要遍历一个数组,必须明确数据的类型 for dict in dictArr as! [[String: String]] { addChildViewController(childControllerName: dict["vcName"]!, tittle: dict["title"]!, imageName: dict["imageName"]!) } print(dictArr) } catch { // 发生异常会执行的代码 print(error) // 从本地加载控制器 addChildViewController(childControllerName: "HomeViewController", tittle: "首页", imageName: "tabbar_home") addChildViewController(childControllerName: "MessageViewController", tittle: "消息", imageName: "tabbar_message_center") addChildViewController(childControllerName: "DiscoverViewController", tittle: "广场", imageName: "tabbar_discover") addChildViewController(childControllerName: "ProfileViewController", tittle: "我", imageName: "tabbar_profile") } } } // MARK: 具体的每个控制器的操作 private func addChildViewController(childControllerName: String,tittle:String ,imageName:String) { // 1.动态获取命名空间 let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String // 2.将字符串转换为类 // 2.1.默认情况下命名空间就是项目的名称,但是命名空间的名称是可以更改的 let Clas: AnyClass? = NSClassFromString(namespace + "." + childControllerName) // 3.通过类创建对象 // 3.1.将AnyClass 转化为指定的类 let vcClass = Clas as! UIViewController.Type // 4.通过class创建对象 let vc = vcClass.init() // 1.设置首页对应的数据 vc.tabBarItem.image = UIImage(named: imageName) vc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") vc.title = tittle // 2.给子控制器包装一个导航控制器 let nav = UINavigationController() nav.addChildViewController(vc) // 3.将导航控制器添加到当前控制器上 addChildViewController(nav) }