6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Xcode] [Swift] Unwind Segueで2つ以上前の画面に一気に戻って画面を再更新する

Last updated at Posted at 2020-08-30

今日からでもすぐに取り入れられて、

  • コードをよりクリーンにできる、とか
  • 工数を削減できる、とか

そんなTipsの紹介記事です。
「知らなかった」「気づかなかった」「忘れていた」そんな誰かの役に立てば幸いです。

前提環境

  • Xcode 11.3.1
  • Swift 5.1.3

Unwind segue

概要・使い所

  • 2つ以上前の画面に一気に戻りたい時。
  • 特に、戻り先の画面にて、画面更新などの処理を行いたい時に便利。

手順

例えば、こんな感じのStroyboardがあるとします。
スクリーンショット 2020-08-29 9.58.44.png

  • FirstViewController > SecondViewController はpush遷移です。
  • SecondViewController > ThirdViewController はmodal遷移です。

やりたいことは**「ThirdViewControllerからFirstViewControllerに一気に戻りたい」**です。

手順1.戻り先に関数を定義する

戻り先であるFirstViewControllerに以下のようなコードを書きます。
関数名はなんでも良いです。

FirstViewController.swift
    @IBAction func backToFirst(_ segue: UIStoryboardSegue) {
        print("\(segue.identifier!)")
    }

手順2.遷移元にUnwind Segueを定義する

Storyboardの遷移元のViewControllerの"Exit"に対して、Ctrlを押しながらオブジェクトをドラッグするとUnwind Segueを定義できます。
スクリーンショット 2020-08-29 10.11.29.png

例えば、UIButtonから"Exit"にCtrl+ドラッグするとこんなふうに上で定義したbackToFirstが表示されますので、それを選択するとUnwind Segueを追加できます。
スクリーンショット 2020-08-29 10.32.28.png

Unwind Segueを追加したら任意のSegue Identifierを付けます。
スクリーンショット 2020-08-29 10.33.58.png

実行結果

ThirdViewControllerのUIButtonをtapすると、
(1) ThirdViewControllerが閉じられ、
(2) SecondViewControllerからFirstViewControllerにpopされる、
という動きになります。

すなわち、「ThirdViewControllerからFirstViewControllerに一気に戻りたい」を簡単に実現できます。

また、FirstViewControllerのbackToFirst(:_)が実行され、segue.identifierに上で付けたfromThirdToFirstが渡ってきます。
すなわち、backToFirst(:_)に、画面更新など、戻り先で行うべきコードを記述することができます。

蛇足

私はコードでこれらを(Unwind Segueと同程度に簡単に)実現できる方法を知りません。
もしご存知の方がいたらコメントで教えていただきたいです。:bow:

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?