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

Xamarin.iOS 两次访问页面后NavigationController为空问题求助

问题排查与修复方案

核心触发原因

  • 重复使用已出栈的视图控制器实例:首次导航返回后,旧的子分类VC已经从导航栈中移除,系统自动将其navigationController属性置空,第二次跳转如果复用该旧实例,调用推送方法就会触发空引用异常
  • 跳转逻辑持有了错误的导航控制器引用:跳转操作由已出栈的对象、子视图、数据模型等非当前激活的页面对象触发,持有的navigationController已经失效
  • 生命周期方法内的异常操作:在子页面的viewDidDisappear等方法中主动解绑了导航控制器相关引用

修复方案

1. 每次跳转创建全新的视图控制器实例

不要全局复用分类、子分类、二级子分类的VC实例,每次用户点击选择分类时重新初始化目标VC,再通过当前在栈的分类页自身的导航控制器执行推送:

// 错误示例:全局持有单例子分类VC,复用导致引用失效
// private let subCategoryVC = SubCategoryViewController()

// 正确示例:每次点击生成新实例
func didSelectCategory(_ category: CategoryModel) {
    let subCategoryVC = SubCategoryViewController(selectedCategory: category)
    self.navigationController?.pushViewController(subCategoryVC, animated: true)
}

2. 统一跳转触发主体

所有页面跳转操作都由当前处于导航栈可见状态的视图控制器触发,不要在自定义Cell、数据请求类、全局工具类中持有navigationController引用执行推送操作,避免引用提前释放。

3. 排查生命周期异常代码

检查子分类、二级子分类、产品页的viewWillDisappear、viewDidDisappear方法,确认没有手动置空navigationController、parent属性,或者主动调用removeFromParent等异常移除操作。

4. 增加空判断防护

在执行推送前增加可选绑定,避免直接闪退,同时可添加日志辅助定位异常场景:

guard let navigationController = self.navigationController else {
    debugPrint("当前页面已不在导航栈内,无法执行跳转:\(self)")
    return
}
navigationController.pushViewController(targetVC, animated: true)

内容的提问来源于stack exchange,提问作者James McNulty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:07