iOS 18中UINavigationController根控制器推送后的生命周期异常问题咨询
问题描述
在iOS 18系统中,当为UINavigationController设置根视图控制器后立即推送另一个视图控制器时,根视图控制器的viewDidLoad()等生命周期方法不会被调用。该问题在iOS 18之前的版本中不存在,且iOS 18官方发布说明未提及此行为变更,已严重影响应用正常运行。
复现步骤
- 初始化
UINavigationController并设置根视图控制器 - 立即调用
pushViewController推送新的视图控制器 - 观察到根视图控制器的
viewDidLoad()等方法未执行
复现代码
import UIKit class HomeViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() print("HomeViewController viewDidLoad") } } class SecondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() print("SecondViewController viewDidLoad") } } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) let home = HomeViewController() let rootNav = UINavigationController(rootViewController: home) window?.rootViewController = rootNav window?.makeKeyAndVisible() let secondViewController = SecondViewController() home.navigationController?.pushViewController(secondViewController, animated: true) return true } }
预期行为
根视图控制器被设置为UINavigationController的根控制器时,其viewDidLoad()等生命周期方法应被正常触发执行。
实际行为
在iOS 18环境下,设置根控制器后立即推送新控制器时,根视图控制器的生命周期方法完全未被调用。
影响
根视图控制器无法完成初始化与配置逻辑,直接导致应用核心工作流程异常。
解决方案
方案1:延迟推送操作
将推送逻辑放入主线程异步队列,给根控制器足够时间完成视图加载:
DispatchQueue.main.async { let secondViewController = SecondViewController() home.navigationController?.pushViewController(secondViewController, animated: true) }
方案2:手动强制加载根控制器视图
在推送新控制器前,主动调用loadViewIfNeeded()触发根控制器的视图加载流程:
home.loadViewIfNeeded() // 强制触发viewDidLoad等方法 let secondViewController = SecondViewController() home.navigationController?.pushViewController(secondViewController, animated: true)
方案3:调整推送时机
将推送逻辑移到根控制器的viewDidAppear(_:)方法中,确保根控制器视图已完成加载后再执行推送:
// 在HomeViewController中添加 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let secondViewController = SecondViewController() navigationController?.pushViewController(secondViewController, animated: true) }
问题原因推测
iOS 18可能优化了视图加载时机:当根控制器的视图未被需要显示时,系统会延迟加载;而立即推送新控制器后,根控制器的视图永远不会进入显示状态,因此生命周期方法不会被触发。上述方案通过强制加载或调整时机规避了该问题。
内容的提问来源于stack exchange,提问作者朱金龙
相关产品推荐
相关产品推荐

