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

如何让Done按钮实现反向Segue返回上一个控制器?(导航控制器场景)

解决Storyboard中Segue进入导航控制器后的反向Segue问题

我完全懂你遇到的这个痛点——很多常规的unwind segue教程都是针对同一导航栈内的页面跳转,但当你先通过Segue进入一个独立的UINavigationController时,常规方法就不管用了。下面我给你详细拆解适配这种场景的步骤:

第一步:在原视图控制器中定义Unwind方法

首先,你需要在**最初的视图控制器(也就是你要返回的那个页面,比如叫ViewControllerA)**里添加一个unwind动作方法,这是所有unwind segue的核心:

import UIKit

class ViewControllerA: UIViewController {
    // 定义unwind方法,名称可以自定义,但要符合@IBAction格式
    @IBAction func unwindToViewControllerA(segue: UIStoryboardSegue) {
        // 这里可以写返回后的逻辑,比如刷新数据、清理状态等
        print("成功回到ViewControllerA")
    }
}

第二步:在导航控制器内的视图控制器中创建Unwind Segue

假设你的页面结构是:ViewControllerA → Segue到UINavigationController(其根视图为ViewControllerB),现在要从ViewControllerB(或导航栈中更深的页面,比如ViewControllerC)回到ViewControllerA:

方式一:通过Storyboard可视化创建

  1. 打开你的Storyboard,选中ViewControllerB里的触发控件(比如一个“返回”按钮)。
  2. 按住Ctrl键,将控件拖向ViewControllerB顶部的Exit图标(就是那个绿色的出口箭头)。
  3. 在弹出的菜单中,选择你刚才在ViewControllerA中定义的unwindToViewControllerA:方法。
  4. 此时Storyboard会自动生成一个unwind segue,运行App点击按钮就能直接回到ViewControllerA。

方式二:通过代码触发Unwind Segue

如果你需要更灵活的触发逻辑(比如满足某个条件才返回),可以给unwind segue设置标识符,然后用代码调用:

  1. 先按照方式一的步骤创建unwind segue,然后在Storyboard中选中这个segue,在右侧Attributes Inspector里设置Identifier(比如UnwindToViewControllerA)。
  2. 在ViewControllerB中添加触发代码:
@IBAction func triggerUnwindManually() {
    // 满足条件时执行unwind
    if shouldGoBack {
        performSegue(withIdentifier: "UnwindToViewControllerA", sender: self)
    }
}

关键注意事项

  • 不要尝试从UINavigationController本身触发unwind segue,因为它是容器控制器,unwind动作必须由其导航栈内的子视图控制器发起。
  • 如果你的Segue是模态呈现(Present Modally)导航控制器,unwind segue会自动关闭整个导航控制器栈并回到原页面;如果是Push方式进入导航控制器,unwind会直接跳回原页面(相当于pop到栈底之外的目标)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:29