如何让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可视化创建
- 打开你的Storyboard,选中
ViewControllerB里的触发控件(比如一个“返回”按钮)。 - 按住
Ctrl键,将控件拖向ViewControllerB顶部的Exit图标(就是那个绿色的出口箭头)。 - 在弹出的菜单中,选择你刚才在
ViewControllerA中定义的unwindToViewControllerA:方法。 - 此时Storyboard会自动生成一个unwind segue,运行App点击按钮就能直接回到
ViewControllerA。
方式二:通过代码触发Unwind Segue
如果你需要更灵活的触发逻辑(比如满足某个条件才返回),可以给unwind segue设置标识符,然后用代码调用:
- 先按照方式一的步骤创建unwind segue,然后在Storyboard中选中这个segue,在右侧Attributes Inspector里设置
Identifier(比如UnwindToViewControllerA)。 - 在
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
相关产品推荐
相关产品推荐

