Swift里动态获取命名空间,通过字符串创建对应的控制器

//
//  MainViewController.swift

import UIKit

class MainViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 0.设置当前控制器对应的tabBar的颜色
        tabBar.tintColor = UIColor.orangeColor()

        // 1.创建tabBar的4个子控制器
        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)
    }
}

你可能感兴趣的:(iOS学习—Swift)