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

Present VC弹出控制器后返回黑屏问题求助(需用Present而非Push)

解决Present方式打开VC3返回时黑屏的问题

嘿,我来帮你搞定这个Present跳转后返回黑屏的麻烦!先理清楚问题出在哪,再给你上正确的代码。

问题根源

你现在遇到的黑屏,主要是两个原因导致的:

  1. 你给VC3设置了modalPresentationStyle = .overCurrentContext,这个样式是让VC3半透明叠加在当前上下文上,但切换Tab再切回VC1时,视图层级会出现混乱;
  2. 你可能还在沿用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:05