You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:49