swift动态添加控制器

2019-01-28  本文已影响0人  夏至樱花祭

项目中有一个需求,根据用户登陆的角色显示对应的界面。框架使用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类型创建控制器。

上一篇下一篇

猜你喜欢

热点阅读