LoginSignup
3
3

More than 3 years have passed since last update.

[Swift] Unwind segue の使い方

Posted at

はじめに

アプリ作成に欠かせない画面遷移関係でUnwind segueを使ったので、自分なりにまとめてみようと思います。
初めてこの名前を聞いた時かなり難しそうに思いましたが、コードはかなりシンプルでした。

使い所

  • 2つ以上前の画面に戻りたい時
  • 画面遷移時に何らかの処理を行いたい時

実装してみた

何個か先の画面から戻ってくるものを作ってみる

下の写真のようにviewを用意し、緑の画面から青の画面に戻ってくるようにコードを書いていきます。
スクリーンショット 2020-12-26 16.08.42.png

青い画面のViewControllerのコード

Unwind segue を使用するためには、戻って来たい画面に以下のコードを書きます。
@IBAction func bluesegue(segue: UIStoryboardSegue) {}
この関数名は各自設定してみてください。
実はコードはこれだけになります。

class ViewController: UIViewController {

    @IBAction func bluesegue(segue: UIStoryboardSegue) {
    }
}

storyboard上でUnwind segueを設定

緑の画面のThirdViewControllerのボタンから青の画面に戻るように設定します。
ボタンからcontrolを押しながら、画像の赤枠のマークのExitにドラック&ドロップします。
スクリーンショット 2020-12-26 16.29.22.png

先程設定した関数の名前が表示されるので、それをクリックします。これで紐付け完了です。
スクリーンショット 2020-12-26 16.24.50.png
赤く囲ったようにUnwind segueが追加されています。
スクリーンショット 2020-12-26 16.26.45.png

動かしてみた

ダウンロード (1).gif

戻る前に値を渡してから遷移する場合

上で作成したものにtextFieldを追加して、画面遷移時に青い画面のlabelに値を渡してみます。
スクリーンショット 2020-12-26 17.36.21.png

緑の画面のコード

ボタンを押した時に、textFieldのtextが変数contentに代入され、Unwindで画面遷移して値を渡します。
今回は値を入れる処理をしてからの画面遷移になりますので、ボタンからの接続ではありません。
以下の画像の赤枠ThirdViewControllerからExitに接続します。
スクリーンショット 2020-12-27 11.18.12.png
そしてUnwind segueにIdentifierを設定します。
そうする事で、Identifierを指定したタイミングでのみUnwind segueで戻る事ができます。
スクリーンショット 2020-12-27 11.23.47.png

コード

ボタンが押されたら代入され、performSegueで先程設定したIdentifierの画面遷移を行います。

class ThirdViewController: UIViewController {
    @IBOutlet var textField: UITextField!
    var content = ""

@IBAction func segueButton(_ sender: Any) {
        content = textField.text!
        performSegue(withIdentifier: "segue", sender: sender)
    }

青い画面のコード

Unwid segueの中にコードを書いていきます。
内容は以下の通りです。

  • 緑の画面ThirdViewControllerにアクセスできるように設定
  • 緑の画面ThirdViewControllerのcontentを青い画面のlabelに入れる
コード

Unwid segueでbluesegueに戻ってきます。
その中にThirdViewControllerにアクセスするための定数を用意します。
ThirdViewControllerから戻ってくるので、ThirdViewControllerはsourceになるそうです。
segue.sourceはこの段階では UIViewController型になりますので、ThirdViewController型に変換してあげる必要があります。
as? ThirdViewController で変換しましょう。

class ViewController: UIViewController {

    @IBOutlet var label: UILabel!

    @IBAction func bluesegue(segue: UIStoryboardSegue) {

        let thirdView = segue.source as? ThirdViewController  //これでThirdViewControllerにアクセスできます。
        label.text = thirdView?.content  //contentをlabelのtextに入れます。
    }
}

動かしてみた

ダウンロード (1).gif

3
3
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
3
3