我们在编程的过程中一搬框架的控制器都是固定,一般都是 用TabBarController管理4个或者更多 Nav(导航控制器),用Nav管理子控制器。
-
问题
假如有一个需要是, 原来是 4个控制器的,现在有产品 提出 需要3个,多余的一个不要,要如何做呢,- 解决方法 是修改代码,去除一个控制器,重新提交一个版本
<# 这样的办法是不是有耗时呢 #>。 - 解决方法2:和后台协商好控制器的个数,由他们返回一个 json数据 来控制, 这里所说的个数包括 数量 和 要显示的控制器的名称
- 解决方法 是修改代码,去除一个控制器,重新提交一个版本
-
实现如下
-
假设返回的数据如下图所示,
-
-
注意:你创建的控制器名称 必须和json返回的数据的控制器名称是一一对应的
- 搭建界面
//1.获取路径
guard let path = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else {
return;
}
guard let jsonData = NSData(contentsOfFile:path) else {
return;
}
//在调用的方法时 最后有一个throws时,该方法会跑出异常
guard let anyObject = try? JSONSerialization.jsonObject(with:jsonData as Data, options: .mutableContainers) else {
return;
}
guard let dicArray = anyObject as? [[String:Any]] else {
return;
}
for dict in dicArray {
guard let title = dict["title"] as? String else {
continue
}
print(title);
guard let vcName = dict["vcName"] as? String else {
continue
}
guard let imageName = dict["imageName"] as? String else {
continue
}
// 方法重载 注意
addChildViewController(childVcName: vcName, title: title, imageName: imageName);
}
//写一个类扩展
extension CCTabBarVC {
private func addChildViewController(childVcName: String, title : String, imageName : String) {
// 0.获取命名空间
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
print("有没有")
return
}
// 1.根据字符串获取对应的Class
guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {
return
}
// 2.将对应的AnyObject转成控制器的类型
guard let childVcType = ChildVcClass as? UIViewController.Type else {
return
}
// 3.创建对应的控制器对象
let childVc = childVcType.init()
// 4.设置子控制器的属性
childVc.title = title
childVc.tabBarItem.image = UIImage(named: imageName)
childVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted")
// 5.包装导航栏控制器
let childNav = UINavigationController(rootViewController: childVc)
// 6.添加控制器
addChildViewController(childNav);
}
}