使用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
相关产品推荐
相关产品推荐

