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

如何获取iOS中所有已呈现的ViewController组成的数组?

获取所有已呈现的ViewController数组

要遍历整个呈现栈并收集所有被呈现的ViewController,你可以通过循环遍历presentedViewController的链式结构来实现——因为iOS中每个ViewController的presentedViewController仅指向它直接呈现的下一个VC,我们需要沿着这条链一直遍历直到末尾。

实现方案

给UIViewController添加扩展方法,用于循环收集所有被呈现的VC:

extension UIViewController {
    // 获取所有被直接present的ViewController(包括导航控制器本身)
    func allPresentedViewControllers() -> [UIViewController] {
        var presentedStack = [UIViewController]()
        var currentVC = self.presentedViewController
        
        while let presented = currentVC {
            presentedStack.append(presented)
            currentVC = presented.presentedViewController
        }
        
        return presentedStack
    }
    
    // 可选:获取每个呈现节点的顶层可见VC(适配导航、标签控制器)
    func topmostPresentedContentVCs() -> [UIViewController] {
        var contentStack = [UIViewController]()
        var currentVC = self.presentedViewController
        
        while let presented = currentVC {
            contentStack.append(presented.topmostViewController())
            currentVC = presented.presentedViewController
        }
        
        return contentStack
    }
    
    // 辅助方法:递归获取当前VC的顶层可见VC
    private func topmostViewController() -> UIViewController {
        if let nav = self as? UINavigationController {
            return nav.topViewController?.topmostViewController() ?? self
        }
        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topmostViewController() ?? self
        }
        if let presented = self.presentedViewController {
            return presented.topmostViewController()
        }
        return self
    }
}

使用方式

  • 若要收集所有被present出来的导航控制器(对应你代码中每次生成的ncPush):
    let allPresentedNavs = rootNavigation?.allPresentedViewControllers() ?? []
    
  • 若要收集每个导航控制器内的栈顶VC(对应你代码中的vcPush):
    let allPresentedContentVCs = rootNavigation?.topmostPresentedContentVCs() ?? []
    

原理说明

iOS的呈现关系是单向链式结构:每个ViewController仅持有直接被它呈现的下一个VC的引用(presentedViewController),系统没有提供直接获取整个呈现栈的API。通过循环遍历这条链,我们可以依次收集所有被呈现的节点,最终得到完整的呈现栈数组。

内容的提问来源于stack exchange,提问作者Nic Hubbard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:42:18