如何从ViewController C获取嵌入Navigation Controller的ViewController A?
解决方案:从C获取被Present的导航控制器中的A视图控制器
这个问题的核心是视图控制器层级发生了变化——之前你直接从C present了A,现在改成了C present导航控制器B,而A是B的根控制器,所以获取路径需要多走一层。
具体实现代码
你可以通过以下步骤从C中拿到A:
- 先获取C通过
present弹出的导航控制器B - 再从B中取出它的根视图控制器(也就是A)
推荐使用安全的可选绑定来避免类型转换崩溃:
// 安全获取A的方式 if let presentedNav = presentedViewController as? UINavigationController, let viewControllerA = presentedNav.rootViewController as? ViewController { // 这里就可以正常使用viewControllerA了 print("成功获取到A:\(viewControllerA)") }
如果喜欢更简洁的链式写法,也可以这样:
let viewControllerA = (presentedViewController as? UINavigationController)?.rootViewController as? ViewController // 使用前记得判空 if let a = viewControllerA { // 处理逻辑 }
为什么之前的代码现在失效了?
之前的项目中,C直接present了A,所以C的presentedViewController就是A本身,直接强转就能拿到。但现在C present的是导航控制器B,所以presentedViewController返回的是B,而A是B的rootViewController,必须多一步获取根控制器的操作。
注意事项
- 尽量避免使用
as!强制类型转换,一旦类型不匹配会直接导致崩溃,用as?配合可选绑定更安全 - 如果你的导航控制器B后续可能添加更多子控制器,确保你确实需要的是根控制器(也就是A),如果需要的是当前显示的控制器,可以用
presentedNav.topViewController替代rootViewController
内容的提问来源于stack exchange,提问作者bcye
相关产品推荐
相关产品推荐

