导航栏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
相关产品推荐
相关产品推荐

