如何通过Xcode控制台打印iOS App所有Segues?解决弃用Push Segues警告
当然可以!遇到这种可视化界面看不到问题根源的情况,我们可以通过代码打印所有segues,或者直接查看Storyboard的底层源码来定位那些隐藏的弃用segues。下面是几种实用的方法:
方法一:通过代码遍历并打印所有Segues
你可以在AppDelegate或者某个初始化的ViewController中添加一段代码,遍历整个应用的视图控制器层级,打印出所有存在的segues及其关键信息,包括它们的类型,这样就能找到那些被标记为弃用的Push Segues。
Swift 代码示例
func printAllSegues() { guard let mainWindow = UIApplication.shared.windows.first, let rootVC = mainWindow.rootViewController else { print("无法获取根视图控制器") return } print("=== 应用内所有Segues信息 ===") traverseViewControllerHierarchy(from: rootVC) } private func traverseViewControllerHierarchy(from viewController: UIViewController) { // 打印当前VC关联的所有segues if let segues = viewController.value(forKey: "storyboardSegues") as? [UIStoryboardSegue] { for segue in segues { let segueID = segue.identifier ?? "无Segue ID" let sourceVC = segue.source.className let destVC = segue.destination.className // 打印segue的类型(关键:区分弃用的Push和新的Show) if let segueKind = segue.value(forKey: "segueKind") as? String { print("Segue ID: \(segueID) | 来源VC: \(sourceVC) | 目标VC: \(destVC) | 类型: \(segueKind)") } else { print("Segue ID: \(segueID) | 来源VC: \(sourceVC) | 目标VC: \(destVC)") } } } // 递归遍历子视图控制器 for childVC in viewController.children { traverseViewControllerHierarchy(from: childVC) } // 处理导航控制器的栈内VC if let navVC = viewController as? UINavigationController { for vc in navVC.viewControllers { traverseViewControllerHierarchy(from: vc) } } // 处理标签控制器的各个标签VC if let tabVC = viewController as? UITabBarController { for vc in tabVC.viewControllers ?? [] { traverseViewControllerHierarchy(from: vc) } } }
使用方式
在AppDelegate的application(_:didFinishLaunchingWithOptions:)方法末尾调用printAllSegues(),运行应用后就能在Xcode控制台看到所有segues的详细信息。如果某个segue的类型是UIStoryboardPushSegue,那就是被弃用的旧类型——即使可视化界面显示的是Show(Push)。
方法二:直接查看Storyboard的XML源码
有时候可视化编辑器的显示和底层XML不一致,你可以直接查看Storyboard的源码来定位问题:
- 在Xcode中右键你的Storyboard文件,选择
Open As -> Source Code - 使用快捷键
Command + F搜索关键词:push或者deprecated - 找到那些带有
kind="push"的segue节点,这些就是触发警告的根源——即使你在可视化界面把它们改成了Show,底层可能还保留着旧的类型声明。
找到后,你可以手动把kind="push"改成kind="show",然后保存,再重新编译就能消除警告。
方法三:通过Build警告的详细信息定位
在Xcode编译时,点击警告信息旁边的箭头展开详情,它会告诉你具体是哪个Storyboard文件、哪一行出现了弃用的Push Segue。直接根据这个位置打开Storyboard的源码,就能快速找到对应的segue并修改。
补充说明
为什么会出现这种“可视化显示是Show但实际是弃用Push”的情况?通常是因为项目从旧版本Xcode升级过来,或者复制粘贴了旧的segue配置,导致可视化编辑器的UI更新了,但底层XML没有同步修改。通过上面的方法,你就能快速定位并修复这些隐藏的问题。
内容的提问来源于stack exchange,提问作者SlavisaPetkovic

