项目中有一个需求,根据用户登陆的角色显示对应的界面。框架使用tabbar+nav模式。每中角色有自己的babaritem名称。在swift中要想根据控制的名称来创建控制,最主要的是要获取当前的命名空间。然后在创建对应的控制器。主要代码如下:
//1:动态获取命名空间,开发中应该充分利用guard语句,guard可以有效的解决可选绑定容易形成{}嵌套问题
guard let name = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
print("获取命名空间失败")
return
}
//2:根据字符串获取Class
var cls: AnyClass? = nil
//model.controllerName是需要创建的控制器的名称(string类型)
if let controllerName = model.controllerName{
cls = NSClassFromString(name + "." + controllerName)
}
//Swift中如果想通过一个Class来创建一个对象, 必须告诉系统这个Class的确切类型,这里注意:所有的视图控制器都是继承于UIViewController
guard let typeClass = cls as? UIViewController.Type else {
print( "cls不能当做UIViewController")
return
}
//通过Class创建对象
let childVC = typeClass.init()
最近重新学习swift。发现之前写的添加控制器代码过于使用oc的模式。现在发现swift自己的方式更加简洁。代码如下
func createChild(title: String,image: String,selectImage: String, _ clses:BaseViewController.Type){
let child = UINavigationController.init(rootViewController: clses())
child.title = title
child.tabBarItem.image = UIImage.init(named: image)
child.tabBarItem.selectedImage = UIImage.init(named: selectImage)
child.tabBarItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .selected)
self.addChild(child)
}
这里主要使用swift的Type类型。使用Type类型创建控制器。