如何获取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
相关产品推荐
相关产品推荐

