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

使用CBFlashyTabBarController时push跳转后导航栏标题不显示如何解决

问题根源

  • 低级笔误:代码中test2VC的navigationItem.title和tabBarItem被错误赋值给了test1VC,同时两个tabBarItem的tag重复,导致test2VC的配置完全未生效
  • 核心逻辑错误:你将CBFlashyTabBarController直接push到了导航控制器栈中,此时导航栏的标题默认读取**导航栈最顶层控制器(也就是tabBarController本身)**的navigationItem.title,而非其内部子VC的对应属性,所以子VC配置的标题不会被导航栏识别。

方案1:采用标准iOS架构(推荐)

苹果官方推荐UITabBarController作为应用根控制器,每个tab项对应独立的UINavigationController,这样每个tab内部的导航栏会自动读取当前栈顶VC的标题,无需手动适配:

// 1. 正确配置Test1
let test1VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Test1")
test1VC.navigationItem.title = "Test1"
test1VC.tabBarItem = UITabBarItem(title: "Test1", image: #imageLiteral(resourceName: "img1TabLarge"), tag: 0)
// 给Test1包独立导航控制器
let nav1 = UINavigationController(rootViewController: test1VC)

// 2. 正确配置Test2,修复赋值错误
let test2VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "0")
test2VC.navigationItem.title = "Test2"
test2VC.tabBarItem = UITabBarItem(title: "Test2", image: #imageLiteral(resourceName: "img2TabLarge"), tag: 1)
// 给Test2包独立导航控制器
let nav2 = UINavigationController(rootViewController: test2VC)

// 3. 初始化tabBarController,传入包装后的导航控制器数组
let tabBarController = CBFlashyTabBarController()
tabBarController.viewControllers = [nav1, nav2]

// 4. 作为根控制器使用,后续各tab内部push/pop操作时导航栏会自动更新标题
UIApplication.shared.windows.first?.rootViewController = tabBarController

方案2:必须将tabBarController push到导航栈的适配方案

如果业务逻辑必须保留现有导航栈结构,需要监听tab切换事件,手动更新tabBarController的navigationItem.title:

// 1. 修复笔误,正确配置两个VC
let test1VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Test1")
test1VC.navigationItem.title = "Test1"
test1VC.tabBarItem = UITabBarItem(title: "Test1", image: #imageLiteral(resourceName: "img1TabLarge"), tag: 0)

let test2VC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "0")
test2VC.navigationItem.title = "Test2"
test2VC.tabBarItem = UITabBarItem(title: "Test2", image: #imageLiteral(resourceName: "img2TabLarge"), tag: 1)

// 2. 初始化tabBarController并设置代理
let tabBarController = CBFlashyTabBarController()
tabBarController.viewControllers = [test1VC, test2VC]
tabBarController.delegate = self // 当前控制器需要遵守UITabBarControllerDelegate协议

// 3. 首次显示时默认设置第一个VC的标题
tabBarController.navigationItem.title = test1VC.navigationItem.title

// 4. push到导航栈
navigationController?.pushViewController(tabBarController, animated: true)
// 实现tabBarController代理方法,切换tab时同步更新标题
extension 当前控制器类名: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        tabBarController.navigationItem.title = viewController.navigationItem.title
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:36:04