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

Unwind Segue执行后原ViewController消失,原因是什么?

解决Unwind Segue返回时视图立刻消失的问题

兄弟,我太懂你这种卡壳的烦躁了!咱们一步步拆解这个问题,帮你搞定它👇

问题根源:你把系统Unwind机制和手动dismiss搞混了

你提到在原ViewController(originalVC)的Unwind过程中调用了dismiss方法,这就是核心问题!Unwind Segue本身已经内置了返回的动画和视图生命周期管理,手动调用dismiss相当于触发了两次视图消失动作——Unwind的滑回动画刚启动,dismiss的默认消失逻辑就跟上了,两种动作冲突,自然会出现“滑回来立刻消失”的诡异现象。

正确的解决步骤

1. 先配置好Unwind Segue的基础逻辑

在你的originalVC里定义一个Unwind专用的IBAction,绝对不要在这里加dismiss代码:

@IBAction func unwindToOriginalVC(segue: UIStoryboardSegue) {
    // 这里可以放返回后的业务逻辑,比如刷新数据、重置状态
    // 但!是!绝对不要写dismiss相关代码!
}

2. 用Storyboard绑定Unwind触发(或代码触发)

  • Storyboard拖线方式:打开Storyboard,找到弹出的第二个VC,把返回按钮(或任意触发返回的控件)拖到VC顶部的「Exit」图标上,选择刚才定义的unwindToOriginalVC,系统会自动创建对应的Unwind Segue。
  • 代码触发方式:如果需要用代码触发返回,在第二个VC里这么写:
    // 比如在返回按钮的点击方法里
    @IBAction func backButtonTapped(_ sender: UIButton) {
        if let unwindSegue = storyboard?.segue(withIdentifier: "UnwindToOriginalVC", sender: self) {
            performSegue(withIdentifier: unwindSegue.identifier, sender: self)
        }
    }
    
    记得提前在Storyboard里给Unwind Segue设置好标识符UnwindToOriginalVC。

3. 检查自定义滑入Segue的实现(确保动画不冲突)

你的右侧滑入Segue要确保present时关闭系统动画,避免和Unwind的动画打架,示例代码参考:

class RightSlideInSegue: UIStoryboardSegue {
    override func perform() {
        let sourceVC = source
        let destinationVC = destination
        
        // 把目标视图先放到原视图上方,初始位置在屏幕右侧
        sourceVC.view.window?.insertSubview(destinationVC.view, aboveSubview: sourceVC.view)
        destinationVC.view.frame = CGRect(x: sourceVC.view.frame.width, y: 0, width: sourceVC.view.frame.width, height: sourceVC.view.frame.height)
        
        // 执行滑入动画
        UIView.animate(withDuration: 0.3, animations: {
            destinationVC.view.frame = sourceVC.view.frame
        }) { _ in
            // 这里必须设animated为false,因为我们已经手动做了动画
            sourceVC.present(destinationVC, animated: false, completion: nil)
        }
    }
}

最后再敲一遍重点

Unwind Segue是系统帮你封装好的返回流程,从动画到视图销毁全给你管了,绝对不要在Unwind的IBAction里手动调用dismiss!把这个多余的代码删掉,你的返回动画就能正常显示了。

内容的提问来源于stack exchange,提问作者Roggie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:32:41