iOS开发 - 类名字符串转化成类

2024-12-23  本文已影响0人  追梦赤子心Year

开发中,我们有一些页面为固定数据的列表页。点击跳往不同的页面。


这样的需求,方法有很多,列举三个常用的方式,最推荐第三个!
数据源:定义一个套字典的数组,跳转只用到标题和类名,可视需求添加其他字段

    var listDic = [["vcName":"FirstVC",
                    "vcTitle":"页面一"],
                   ["vcName":"SecondVC",
                    "vcTitle":"页面二"],
                   ["vcName":"ThirdVC",
                    "vcTitle":"页面三"]]

方式一:根据点击行数进行判断,跳不同的页面(没啥技术含量)

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        switch indexPath.row {
        case 0:
            let vc = FirstVC()
            self.navigationController?.pushViewController(vc, animated: true)
        case 1:
            let vc = SecondVC()
            self.navigationController?.pushViewController(vc, animated: true)
        case 2:
            let vc = ThirdVC()
            self.navigationController?.pushViewController(vc, animated: true)
        default:
            return
        }
    }

方式二:根据内容判断点击的是哪一个数据,再跳往下一个页面(也没啥技术含量)

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let vcName = listDic[indexPath.row]["vcTitle"] else { return print("error") }
        if vcName == "页面一" {
            let firstVC = FirstVC()
            firstVC.title = vcName
            self.navigationController?.pushViewController(firstVC, animated: true)
        } else if vcName == "页面二" {
            let secondVC = SecondVC()
            secondVC.title = vcName
            self.navigationController?.pushViewController(secondVC, animated: true)
        } else if vcName == "页面三" {
            let thirdVC = ThirdVC()
            thirdVC.title = vcName
            self.navigationController?.pushViewController(thirdVC, animated: true)
        }
    }

方式三:根据类名自动创建类,OC中映射。在swift中不能直接用,因为多了一个命名空间的概念

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // 数据源:  listData = ["SnapDemoVC", "AutomaticVC"]
        // 1. 获取去命名空间,由于项目肯定有info.plist文件所有可以机型强制解包.
        guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else { return print("没有获取到命名空间")}
        print("命名空间为:",nameSpace)
        // 2. 拼写命名空间.类名(比如)
        let vcName = nameSpace + "." + listDic[indexPath.row]["vcName"]!
        print("文件名:", vcName)
        // 3. 将类名转化成类
        guard let classType = NSClassFromString(vcName) else { return print("\"\(vcName)\" is not class") }
        // 4. 将类转化成UIViewController
        guard let vcType = classType as? UIViewController.Type else { return print("\"\(vcName)\" is not UIViewController") }
        
        // 5. 用vcType实例化对象
        let vc = vcType.init()
        // 6. 跳转
        navigationController?.pushViewController(vc, animated: true)
    }

优点很多,最大优势是,想增、删、改页面跳转时,只需要管理数据源,不需要改didSelectRow里面任何代码,非常简洁,也便于维护。

上一篇 下一篇

猜你喜欢

热点阅读