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

push后ViewController的navigationController属性为nil,栈无vc2原因排查

问题解答:vc2的navigationController为nil且未入栈的原因

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:20:08