使用 unwind segues 关闭当前页面

我们经常会遇到这样一种需求,在控制器上有一个关闭按钮,点击来关闭当前页面。而我们通常的做法都是在 Storyboard 上拖一个 UIButton 出来,然后将 UIButton 拖线到控制器上,新建一个 IBAction 方法,并在该方法中通过代码来关闭当前控制器。

其实,我们可以不需要这么麻烦,可以通过 Unwind Segue 在 Storyboard 上拖拖线即可达到关闭控制器的效果。

创建一个 Unwind Segue

unwind是一个实例方法,以UIStoryboardSegue作为其唯一的方法参数,返回类型为IBAction,它对方法名称不作要求,也不需要在头文件中进行声明。

需要注意的是,我们需要将 uniwnd action 定义在 UIStoryboardSegue 的 sourceViewController 上,而非当前控制器。例如 A push B 然后从 B 返回 A 这个场景,我们需要将 unwind action 定义在 A 上。

但是我们可以通过扩展 UIViewController 以便所有控制器均可以使用,从而不用关心具体写在哪个控制器上。

- (IBAction)unwindSegue:(UIStoryboardSegue*)sender {
    // Pull any data from the view controller which initiated the unwind segue.
}
extension UIViewController {

    @IBAction func unwindSegue(_ sender: UIStoryboardSegue) {
        // Pull any data from the view controller which initiated the unwind segue.
    }

}

将 Unwind Segue 添加到故事板

  • 方法1

a. 选中退出图标,右击弹出 Segues 列表

b. 将 unwindSegue: 拖线到控制器图标上

c. 设置一个 identifier

经过这样的拖线绑定之后,我们就可以在代码中通过发送一个 performSegue(withIdentifier:sender:) 消息来关闭当前控制器。

  • 方法2

a. 选中按钮,然后按住 control 拖线到退出图标上

b. 在弹出的 Action Segues 中选择 unwindSegue:

这样,当我们点击按钮的时候,就会自动关闭当前控制器了。

Technical Note TN2298 Using Unwind Segues