获取UIViewController关联Segue遇UIStoryboardSegueTemplate未定义问题求助
获取UIViewController关联的所有Segue(含自定义Segue)解决方案
你遇到的问题很典型——UIStoryboardSegueTemplate是UIKit的私有类,公开SDK里并没有暴露这个类的定义,所以直接强转肯定会报“未找到”的错误。下面给你两种可行的解决思路:
方案一:通过KVC访问私有属性(调试/内部工具用)
既然你已经通过value(forKey: "storyboardSegueTemplates")拿到了Segue模板数组,我们可以通过KVC读取每个模板的关键属性,不用强转私有类:
if let segueTemplates = value(forKey: "storyboardSegueTemplates") as? [Any] { for template in segueTemplates { // 获取Segue标识符 let identifier = template.value(forKey: "identifier") as? String ?? "无标识符" // 获取自定义Segue的类名(系统Segue此值为nil) let segueClassName = template.value(forKey: "segueClassName") as? String // 获取目标控制器 let destination = template.value(forKey: "destinationViewController") as? UIViewController print("Segue标识符:\(identifier)") if let className = segueClassName { print("这是自定义Segue:\(className)") } else { print("这是系统默认Segue") } if let destVC = destination { print("目标控制器:\(type(of: destVC))") } print("---") } }
方案二:更安全的上线兼容方案(避免私有API)
如果代码需要上线App Store,直接用私有属性有被拒风险。可以换个思路:在控制器里重写prepare(for:sender:)方法,记录触发过的Segue:
class YourViewController: UIViewController { private var triggeredSegues = Set<String>() override func prepare(for segue: UIStoryboardSegue, sender: Any?) { super.prepare(for: segue, sender: sender) triggeredSegues.insert(segue.identifier ?? "") // 可在此记录Segue更多信息,比如类型、目标控制器等 } // 获取已触发的Segue列表 func getTriggeredSegues() -> Set<String> { return triggeredSegues } }
不过这个方法只能记录已触发过的Segue,没法提前获取控制器上关联的所有Segue,适合不需要预加载所有Segue信息的场景。
额外提示
如果一定要在上线代码里获取所有Segue,建议通过解析Storyboard的XML文件实现——读取.storyboard文件内容,解析其中的<segue>标签,这种方式完全基于公开API,无审核风险。
内容的提问来源于stack exchange,提问作者Reimond Hill
相关产品推荐
相关产品推荐

