Present VC弹出控制器后返回黑屏问题求助(需用Present而非Push)
解决Present方式打开VC3返回时黑屏的问题
嘿,我来帮你搞定这个Present跳转后返回黑屏的麻烦!先理清楚问题出在哪,再给你上正确的代码。
问题根源
你现在遇到的黑屏,主要是两个原因导致的:
- 你给VC3设置了
modalPresentationStyle = .overCurrentContext,这个样式是让VC3半透明叠加在当前上下文上,但切换Tab再切回VC1时,视图层级会出现混乱; - 你可能还在沿用Push跳转时的
popViewController来返回,但Present出来的控制器必须用dismiss方法关闭,这俩是完全不同的跳转逻辑,混用肯定出问题。
正确的实现代码
1. VC1中Present VC3的正确代码
fileprivate func presentDetail(at indexPath: IndexPath) { self.updateCell(at: indexPath) self.startLoading() // 用可选绑定代替强制解包,避免崩溃风险 guard let vc3 = storyboard?.instantiateViewController(withIdentifier: "vc3") as? VC3 else { print("无法实例化VC3,请检查标识符或类型") return } // 推荐用.fullScreen或者.automatic(iOS13+),避免.overCurrentContext带来的层级问题 // 如果确实需要半透明效果,用.pageSheet会更稳定 vc3.modalPresentationStyle = .fullScreen vc3.data = mDataSource.shared.demoData[indexPath.row] self.present(vc3, animated: true, completion: nil) }
2. VC3中返回按钮的正确实现
@IBAction func backBtnTapped(_ sender: Any) { // Present出来的控制器必须用dismiss关闭,而不是pop! self.dismiss(animated: true, completion: nil) }
额外小贴士
- 如果非要用
.overCurrentContext,得确保VC1所在的导航控制器在切换Tab时不会被回收,同时VC3的过渡样式也要适配,但这个样式本身就容易引发视图层级bug,非必要不建议用; - 永远别用
as!强制解包,用as?配合可选绑定能避免很多不必要的崩溃; - 导航栈跳转(Push/Pop)和模态跳转(Present/Dismiss)是两套独立的逻辑,千万别混用方法!
内容的提问来源于stack exchange,提问作者user8674636
相关产品推荐
相关产品推荐

