Swift:TabBar+NavigationController下控制器转场黑背景问题求助
解决临时控制器跳转后黑色背景及TabBar/导航返回按钮问题
首先,咱们先理清楚你的需求逻辑:当前控制器(已经嵌套在UITabBarController和UINavigationController里)先弹出一个临时控制器,之后从这个临时控制器跳转到B控制器,要求B能显示TabBar和导航栏的返回按钮,同时解决segue跳转时的黑色背景问题。
可能的问题根源
你遇到的黑色背景+TabBar/返回按钮缺失,大概率是因为跳转逻辑破坏了原有的导航栈结构:
- 如果直接用segue从临时控制器跳转B,临时控制器是模态弹出的(不在原导航栈里),用
show类型的segue会导致B被push到临时控制器的导航栈(而临时控制器根本没有导航控制器),或者用present类型的话,B是模态出来的,完全脱离了原TabBar的上下文,自然没有TabBar,背景也可能因为模态样式不对变成黑色。
分步解决方案
1. 正确弹出临时控制器
首先,临时控制器应该用模态弹出的方式显示,而不是push到导航栈里(因为它是临时的,不应该加入原导航栈):
// 在当前控制器里弹出临时控制器 let tempVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TempViewController") // 设置模态样式,避免背景透明导致异常 tempVC.modalPresentationStyle = .fullScreen // 或者.automatic,根据你的需求选 present(tempVC, animated: true)
2. 从临时控制器跳转到B的正确方式
不能直接用segue从临时控制器跳B,而是要先关闭临时控制器,再让原导航栈push B,这样B就能回到原TabBar和导航的上下文里:
在临时控制器的跳转事件中(比如按钮点击):
@IBAction func jumpToBAction(_ sender: UIButton) { // 先关闭临时控制器 dismiss(animated: true) { [weak self] in guard let self = self else { return } // 获取原TabBar控制器 guard let tabBarController = UIApplication.shared.connectedScenes .compactMap({ $0 as? UIWindowScene }) .first?.windows .first(where: { $0.isKeyWindow })?.rootViewController as? UITabBarController else { return } // 获取当前Tab对应的导航控制器(比如当前选中的Tab) guard let currentNav = tabBarController.selectedViewController as? UINavigationController else { return } // 实例化B控制器 let bVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BViewController") as! BViewController // push到原导航栈,这样B就有返回按钮,同时TabBar也会显示 currentNav.pushViewController(bVC, animated: true) } }
3. 解决黑色背景的额外检查
- 检查临时控制器和B控制器的
view.backgroundColor是否设置为非黑色(比如.white),默认背景是黑色,这也是常见的黑背景原因。 - 如果一定要用storyboard的segue,那需要把segue的类型改成手动触发+先dismiss再push,不要直接用storyboard里的segue连接临时控制器和B,而是在临时控制器里调用
performSegue之前先dismiss,不过这种方式不如上面的代码直接。
为什么这样可行?
通过先关闭临时控制器,再让原TabBar对应的导航控制器push B,B就会加入到原导航栈中:
- 导航栏的返回按钮会自动生成(因为导航栈里有之前的控制器)
- TabBar会显示,因为B所在的导航控制器是TabBarController的子控制器,只要导航栈里的控制器没有隐藏TabBar(
hidesBottomBarWhenPushed = false),就会显示TabBar。
内容的提问来源于stack exchange,提问作者Jhony
相关产品推荐
相关产品推荐

