调用popToRootViewController后VC1的viewWillAppear不触发如何解决
问题背景
现有页面跳转链路如下:VC1 ->(PUSH)-> VC2 ->(PUSH)-> VC3,在VC3中执行以下代码返回根控制器VC1时,VC1的viewWillAppear(_:)方法未正常触发:
self.navigationController?.popToRootViewController(animated: false)
可行解决方案
- 方案1:调整pop动画参数
将popToRootViewController的animated参数修改为true即可。UIKit在处理无动画的页面切换时,会默认省略部分生命周期方法的回调来提升性能,开启动画后会按照标准流程触发所有相关VC的生命周期。 - 方案2:手动触发VC1的生命周期方法
如果业务逻辑要求必须使用无动画跳转,可以在执行pop操作后手动调用VC1的viewWillAppear(_:)方法,示例代码如下:guard let navigationController = self.navigationController else { return } navigationController.popToRootViewController(animated: false) if let rootVC = navigationController.viewControllers.first as? VC1 { rootVC.viewWillAppear(false) // 若业务需要也可以同步调用viewDidAppear(_:) rootVC.viewDidAppear(false) } - 方案3:全局统一处理无动画pop的生命周期回调
如果项目中存在大量类似无动画跳转的场景,可以给UINavigationController添加分类,或者重写自定义导航控制器的popToRootViewController(animated:)方法,统一在pop操作完成后触发顶部控制器的生命周期方法,避免每个业务页面单独处理。 - 方案4:排查自定义容器的生命周期拦截逻辑
如果项目中使用了自定义的UINavigationController子类,或者VC1被作为子控制器添加到了其他容器控制器中,检查对应容器的生命周期方法是否正确调用了super,以及是否存在拦截子控制器生命周期回调的逻辑。
内容的提问来源于stack exchange,提问作者stackich
相关产品推荐
相关产品推荐

