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

iOS 18中UINavigationController根控制器推送后的生命周期异常问题咨询

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,提问作者朱金龙

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:23:21