TabBarController中「更多」标签页无法推送视图控制器问题排查
问题根源与解决思路
问题出在UITabBarController的「更多」标签页机制上:当标签数量超过4个时,iOS会自动将多余标签封装到一个系统自带的UINavigationController中。此时self.selectedViewController返回的是这个系统导航控制器,而非你自己创建的、包含ServiceVC/FacebookVC的导航控制器。你调用selectedNavController.pushViewController时,实际是往系统的「更多」导航栈里push,而非当前显示页面的导航栈,所以看不到跳转效果。
解决方法一:修正导航控制器获取逻辑
修改handleButtonTap函数,跳过系统的「更多」导航控制器,直接获取当前显示页面所属的导航控制器:
@available(iOS 13.0, *) @objc private func handleButtonTap(){ print("pressed") var currentVC = self.selectedViewController // 若选中的是系统的「更多」导航控制器,取其顶层VC if let moreNav = currentVC as? UINavigationController, moreNav !== self.viewControllers?.first { currentVC = moreNav.topViewController } guard let targetNav = currentVC?.navigationController else { return } let vc = MenuViewController() targetNav.pushViewController(vc, animated: true) }
解决方法二:让每个页面自行处理跳转逻辑
避免依赖TabBarController的层级判断,直接让每个页面的按钮自己处理push动作:
- 给UIViewController添加扩展,统一实现菜单跳转逻辑:
extension UIViewController { @objc func showMenu() { let vc = MenuViewController() self.navigationController?.pushViewController(vc, animated: true) } }
- 修改
createNav函数中按钮的target为当前页面VC:
nav.viewControllers.first?.navigationItem.rightBarButtonItem = UIBarButtonItem( image: UIImage(systemName: "list.bullet"), style: .plain, target: nav.viewControllers.first, action: #selector(UIViewController.showMenu) )
补充验证逻辑
你移动标签位置后其他页面失效,是因为这些页面被移到了「更多」标签页中,触发了同样的系统导航控制器层级问题。本质问题和具体VC无关,只和它是否处于「更多」标签页有关。
内容的提问来源于stack exchange,提问作者vonnov
相关产品推荐
相关产品推荐

