push后ViewController的navigationController属性为nil,栈无vc2原因排查
a) vc2.navigationController 为nil的原因
- 视图控制器的
navigationController属性仅在它已被加入导航控制器的视图栈时,才会指向对应的导航实例。 - 你调用
pushViewController(vc2, animated: true)后立刻打印,此时动画还未执行,vc2还没被添加到导航栈,因此该属性返回nil。
b) 导航控制器栈中没有vc2的原因
- 当
animated参数设为true时,pushViewController会以动画方式完成推送,这个操作是异步执行的,依赖UIKit的运行循环(Runloop)调度动画和栈更新逻辑。 - 代码在push后立即同步打印
viewControllers,此时异步的栈更新操作还未完成,所以只能看到初始的vc1。
解决办法
方案1:关闭动画同步推送
如果不需要过渡动画,将animated设为false,此时push操作会同步完成,执行后即可立即看到栈更新:
navController1.pushViewController(vc2, animated: false) print(navController1.viewControllers) // 输出包含vc1和vc2的数组 print(vc2.navigationController) // 输出navController1实例
方案2:等待动画完成后再检查
如果需要保留动画,需等待异步操作完成后再执行打印。以Playground环境为例,需要先开启无限执行,再延迟检查:
import UIKit import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true let vc1 = UIViewController() let navController1 = UINavigationController(rootViewController: vc1) print(navController1.viewControllers) print(vc1.navigationController) let vc2 = UIViewController() navController1.pushViewController(vc2, animated: true) // 延迟0.5秒,确保动画完成 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { print(navController1.viewControllers) // 此时栈包含vc1和vc2 print(vc2.navigationController) // 此时指向navController1 PlaygroundPage.current.finishExecution() }
内容的提问来源于stack exchange,提问作者fingia
相关产品推荐
相关产品推荐

