#はじめに
アプリ作成に欠かせない画面遷移関係でUnwind segueを使ったので、自分なりにまとめてみようと思います。
初めてこの名前を聞いた時かなり難しそうに思いましたが、コードはかなりシンプルでした。
#使い所
- 2つ以上前の画面に戻りたい時
- 画面遷移時に何らかの処理を行いたい時
#実装してみた
####何個か先の画面から戻ってくるものを作ってみる
下の写真のようにviewを用意し、緑の画面から青の画面に戻ってくるようにコードを書いていきます。
####青い画面のViewControllerのコード
Unwind segue を使用するためには、戻って来たい画面に以下のコードを書きます。
@IBAction func bluesegue(segue: UIStoryboardSegue) {}
この関数名は各自設定してみてください。
実はコードはこれだけになります。
class ViewController: UIViewController {
@IBAction func bluesegue(segue: UIStoryboardSegue) {
}
}
####storyboard上でUnwind segueを設定
緑の画面のThirdViewControllerのボタンから青の画面に戻るように設定します。
ボタンからcontrolを押しながら、画像の赤枠のマークのExitにドラック&ドロップします。
先程設定した関数の名前が表示されるので、それをクリックします。これで紐付け完了です。
赤く囲ったようにUnwind segueが追加されています。
#動かしてみた
#戻る前に値を渡してから遷移する場合
上で作成したものにtextFieldを追加して、画面遷移時に青い画面のlabelに値を渡してみます。
####緑の画面のコード
ボタンを押した時に、textFieldのtextが変数contentに代入され、Unwindで画面遷移して値を渡します。
今回は値を入れる処理をしてからの画面遷移になりますので、ボタンからの接続ではありません。
以下の画像の赤枠ThirdViewControllerからExitに接続します。
そしてUnwind segueにIdentifierを設定します。
そうする事で、Identifierを指定したタイミングでのみUnwind segueで戻る事ができます。
#####コード
ボタンが押されたら代入され、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に入れます。
}
}