美文网首页
iOS开发 - 类名字符串转化成类

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

作者: 追梦赤子心Year | 来源:发表于2024-12-23 16:03 被阅读0次

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


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

    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里面任何代码,非常简洁,也便于维护。

相关文章

  • iOS中的反射技术

    反射技术简单应用就是把 根据字符串创建类/调用方法/协议等。 把类名/方法名/协议名 转化字符串的优势: iOS中...

  • OC学习(1)-字符串

    字符串 NSString类属于Foundation框架中字符串操作类Foundation框架是iOS开发编程的基础...

  • 基础知识面试

    1. iOS反射机制? 通过类名的字符串形式实例化对象 Classclass=NSClassFromString(...

  • iOS class反射

    iOS class反射 •通过类名的字符串形式实例化对象 Class class NSClassFromStrin...

  • 15-内存管理

    元类 类也是对象(属于元类的对象)#打印字符串(字符串是对象)print("HelloWorld")#打印类名,类...

  • 009:类前缀

    类前缀 使用Objective-C开发iOS程序时,最好在每个类名前面加一个前缀,用来标识这个类的“老家”在哪 目...

  • iOS-类的加载

    前言   作为一名iOS开发人员,我们总是要不停的和类打交道,我们可能已经习惯创建类、实例化类、为类添加属性、添加...

  • iOS直播类APP开发流程解析(内附源码详解)

    iOS直播类APP开发流程解析(内附源码详解) iOS直播类APP开发流程解析(内附源码详解)

  • iOS app开发安全攻略

    前言 此文旨在为iOS app开发者提供最全的常用安全防护手段。涉及到如字符串加密,类名以及方法名混淆,程序结构混...

  • Java--DateFormat类和SimpleDateForm

    DateFormat类的作用  把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。  Da...

网友评论

      本文标题:iOS开发 - 类名字符串转化成类

      本文链接:https://www.haomeiwen.com/subject/wqhqsjtx.html