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

导航栏titleView添加ToolbarVC崩溃,父控制器层级异常求助

解决UIViewControllerHierarchyInconsistency崩溃问题

这个崩溃我之前也碰到过,核心是你搞混了视图控制器的层级关系,咱们一步步拆解问题和解决办法:

错误原因分析

你把ToolBarVC的视图放到了导航栏的titleView里,但导航栏属于UINavigationController的视图层级体系。当你通过addChildViewController把ToolBarVC添加为TakingNoteVC的子控制器时,系统会检测到:这个子控制器的视图所在的父视图(导航栏)不属于TakingNoteVC的视图树,而是属于UINavigationController,因此抛出了层级不一致的错误。

两种可行的解决方法

方法一:直接用视图构建工具栏(推荐)

如果工具栏的逻辑不复杂,完全不需要单独的视图控制器,直接在TakingNoteVC里创建UIToolbar或自定义视图,添加到titleView即可,避免控制器层级问题:

// 在TakingNoteVC的viewDidLoad或合适的方法中
let toolbar = UIToolbar()
toolbar.sizeToFit()

// 创建工具按钮
let btn1 = UIBarButtonItem(title: "按钮1", style: .plain, target: self, action: #selector(btn1Tapped))
let btn2 = UIBarButtonItem(title: "按钮2", style: .plain, target: self, action: #selector(btn2Tapped))
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)

toolbar.items = [btn1, flexibleSpace, btn2]

// 设置为导航栏titleView
navigationItem.titleView = toolbar

// 按钮点击方法
@objc func btn1Tapped() {
    // 处理点击逻辑
}

@objc func btn2Tapped() {
    // 处理点击逻辑
}

方法二:正确设置ToolBarVC的父控制器

如果你确实需要用ToolBarVC来管理工具栏的逻辑,那必须把它的父控制器设置为UINavigationController,而不是TakingNoteVC:

// 在TakingNoteVC中
let toolbarVC = ToolbarVC()
guard let navController = navigationController else { return }

// 添加为导航控制器的子控制器
navController.addChild(toolbarVC)
// 设置视图为titleView
navigationItem.titleView = toolbarVC.view
// 完成子控制器添加流程
toolbarVC.didMove(toParent: navController)

// 注意:在TakingNoteVC销毁时,记得移除子控制器
deinit {
    toolbarVC.willMove(toParent: nil)
    toolbarVC.view.removeFromSuperview()
    toolbarVC.removeFromParent()
}

这样设置后,ToolBarVC的父控制器就是UINavigationController,和它的视图所在的导航栏层级匹配,就不会再触发崩溃了。

内容的提问来源于stack exchange,提问作者Quốc Huy Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:12:56