Swiftでセグエを利用した画面遷移


# 概要
画面遷移はアプリとして基本的な動作なのに、頭の中でちょっと整理できていないので覚え書き。

# ファイル構成
まずは、ファイル構成。`UIViewController`を継承した `FirstViewController` `SecondViewController`を作成する。

![スクリーンショット 2014-11-22 23.50.57.png](https://qiita-image-store.s3.amazonaws.com/0/3184/9665847f-da62-66dd-311c-e15b8c19eb27.png "スクリーンショット 2014-11-22 23.50.57.png")


Storyboardで、2つの`ViewController`を配置し、ラベルとテキストボックスを適当に配置する。

![スクリーンショット 2014-11-22 23.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/3184/70faf080-a4d5-2d50-78ff-3abc9555af88.png "スクリーンショット 2014-11-22 23.51.22.png")


そして、それぞれのカスタムクラスを割り当てる。

![スクリーンショット 2014-11-22 23.57.42.png](https://qiita-image-store.s3.amazonaws.com/0/3184/3b0df10d-3f7b-a87c-c48b-91c129820abd.png "スクリーンショット 2014-11-22 23.57.42.png")


# セグエの作成

`FirstViewController`に配置したGoボタンから`segue`を伸ばして、`SecondViewController`へセグエ(custome)を作成する。

# 画面遷移(FirstView → SecondView)

![スクリーンショット 2014-11-23 0.06.27.png](https://qiita-image-store.s3.amazonaws.com/0/3184/74500eae-820a-86a5-ca3d-3b4997f35172.png "スクリーンショット 2014-11-23 0.06.27.png")

作成したセグエに`identifier`名を設定する。ここでは、`goSecondViewSegue`とする。

![スクリーンショット 2014-11-23 0.07.29.png](https://qiita-image-store.s3.amazonaws.com/0/3184/7fd65710-5543-91cd-1dfe-499542bac238.png "スクリーンショット 2014-11-23 0.07.29.png")

ここまでで、実行してGoボタンを押してみると`FirstView`から`SecondView`へ画面遷移するはずである。とても簡単。

# 画面遷移(SecondView → FirstView)

しかし、このままだと戻れないので、Backボタンを押すと`FirstView`へ戻るように設定してやる。
その為に、`FirstViewController`内に、戻ってきた時にコールされるメソッドを定義してやる。
そうすると、Backボタンを右クリックにて`SecondView`にある`Exit`ボタンへ伸ばすと、`FirstViewController`に定義したメソッドが表示されるので設定する。ここでは、`backFromSecoundView`というメソッドにした。

```FirstViewController.swift
    /*
     * SecondViewから戻ってきた時の処理
     */
    @IBAction func backFromSecondView(segue:UIStoryboardSegue){
        NSLog("FirstViewController#backFromSecondView")
    }
```

![スクリーンショット 2014-11-23 0.29.30.png](https://qiita-image-store.s3.amazonaws.com/0/3184/ba3be6c5-ebb6-82dd-69ab-554d039270f3.png "スクリーンショット 2014-11-23 0.29.30.png")


`FirstViewController`に定義するのがミソである。結構この方法がややこしく忘れやすい。

そこで実行するとBackボタンから戻ることができるはずである。

## ソースコード

ここまでのソースコードは下記。

```FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    /*
     * SecondViewから戻ってきた時の処理
     */
    @IBAction func backFromSecondView(segue:UIStoryboardSegue){
        NSLog("FirstViewController#backFromSecondView")
    }
}
```

```SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}
```

# パラメータの受け渡し

たいていのアプリでは画面遷移の時には、必ずパラメータの受け渡しが必要となってくる。
そこで今回は`FirstView`のテキストボックスに入力した値(String)を`SecondView`で表示してみる。


まずは`SecondViewController`に、パラメータ受取用のプロパティ変数を宣言しておく。初期化処理の時にデータが表示ラベルとバインドするように代入する。

```SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
    
    @IBOutlet weak var paramLabel: UILabel!

    //パラメータ受取用プロパティ
    var param:String = "init param"

    override func viewDidLoad() {
        super.viewDidLoad()
        //パラメータのバインド
        self.paramLabel.text = self.param
    }
}
```

パラメータを送信する`FirstViewController`側では、セグエで画面遷移する前に呼ばれる`prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)`メソッドを`override`してパラメータを設定する。
遷移先である`SecondViewController`をインスタンス化して画面で入力したテキストボックスの値を設定する。

```FirstViewController.swift
    /*
     * 画面遷移
     */
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
        var secondViewController:SecondViewController = segue.destinationViewController as SecondViewController
        secondViewController.param = self.paramText.text
    }

```

これを実行すると、テキストボックスで入力したデータが、遷移先の画面のラベルに表示される。

ちなみに、入力された値の検証には、`shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?)`メソッドをを`override`して、問題あれば`false`を返すようにするようだ。

```FirstViewController.swift
    /*
     * 画面遷移の前に実行する検証メソッド
     */
    override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
        return true
    }
```

今回はここまで。

**Lovely Swift!!!**