Swift中点击按钮如何为ViewController动态设置不同自定义类?
解决方案
首先要明确:从Storyboard实例化的ViewController对象,其类是在Storyboard里预先指定好的,没法在运行时直接修改这个对象的类。你得根据点击的按钮,实例化对应自定义类的ViewController实例,而不是去改已创建实例的类。
具体实现步骤:
- 给三个按钮分别设置不同的
tag值(比如0、1、2),用来区分点击的是哪个按钮 - 根据按钮的
tag,选择对应的自定义类来实例化ViewController - 给ViewController配置对应的数据后再呈现
完整代码示例:
@IBAction func openTest(_ sender: UIButton) { // 根据按钮tag匹配对应的自定义类 let targetClass: UIViewController.Type switch sender.tag { case 0: targetClass = CustomClass1.self case 1: targetClass = CustomClass2.self case 2: targetClass = CustomClass3.self default: targetClass = UIViewController.self // 兜底的默认类 } // 从Storyboard实例化对应类的ViewController guard let vc = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "ExSim") as? targetClass else { fatalError("无法实例化指定类的ViewController") } // 给VC配置对应数据(假设自定义类有统一的数据配置入口) if let configurableVC = vc as? DataConfigurable { configurableVC.setupData(with: getTargetData(for: sender.tag)) } present(vc, animated: true) } // 定义协议统一处理数据配置 protocol DataConfigurable { func setupData(with data: Any) } // 根据tag获取对应的数据 func getTargetData(for tag: Int) -> Any { switch tag { case 0: return "对应按钮1的业务数据" case 1: return "对应按钮2的业务数据" case 2: return "对应按钮3的业务数据" default: return "" } }
额外建议:
如果想让三个自定义类共享完全一致的UI,可以让它们继承自同一个基类(比如BaseExSimVC),把这个基类设置为Storyboard中"ExSim"的类,然后三个自定义类只负责处理不同的数据逻辑,这样既能保证UI统一,又能实现各自的业务差异。
内容的提问来源于stack exchange,提问作者Alex Izmestyev
相关产品推荐
相关产品推荐

