【iOS】画面遷移の基礎【Swift3.0】

# この記事で理解できること

- ストーリーボードを使用した画面遷移の方法（その１：presentメソッド)
- ストーリーボードを使用した画面遷移の方法（その2：performSegueメソッド)
- ナビゲーションコントローラ配下時の画面遷移アニメーションの違い


## presentメソッドによる遷移
### 1. プロジェクトの作成
まずは、「Single View Application」をテンプレにプロジェクトを新規作成します。ストーリーボード上で、図のようにそれぞれのViewController上にボタンを配置します。instantiateViewControllerに備えて遷移先の画面（背景が黄色の画面）にStoryboard IDを割り当てておきます。この例では***nextView***としました。
<img width="1525" alt="0.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/94b3118e-ed89-5406-fbed-ef6c41080c81.png">


### 2. 画面遷移のファンクションを作成
画面遷移のアクションとしてgoNext()を以下のように実装します。戻るアクション用のgoBack()は空実装でかまいませんが、パラメタはUIStoryboardSegue型の引数を持たせる必要があります。**present**が画面遷移をおこなうUIViewControllerのインスタンスメソッドです。

ViewController.swift

```swift
import UIKit

class ViewController: UIViewController {

    @IBAction func goBack(_ segue:UIStoryboardSegue) {}
    
    @IBAction func goNext(_ sender:UIButton) {
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView")
        self.present(next,animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```
### 3. ストーリーボード上の部品とソースの紐付け
backボタンはcontrolを押しながら上部のExitアイコンへドロップし、goBackを選択します。これだけで戻るボタンの実装は完了です。goBack()は***遷移元のViewControllerクラスに用意する***ことに注意してください。
<img width="1962" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/bfbec31b-fce4-bc43-2612-e5e5b0514422.png">

### 4. ビルドして確認
デフォルトは下からニョキッと出て来るアニメーションです。
![present.gif](https://qiita-image-store.s3.amazonaws.com/0/151314/bb1fc958-e2d9-e585-aa24-6229bea35cf6.gif)

## performSegueメソッドによる遷移

### ５.セグエの作成
今度はセグエでの遷移を確認してみます。１画面目にボタンを追加し、ViewController上部のアイコンから遷移先のView上までcontrolを押しながらドラッグします。セグエの種類を選ぶポップアップが出現するのでShowを選びます。
<img width="1526" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/6411b0b2-641b-82ba-2e7b-116de9455d2c.png">

２つの画面の間にセグエのアイコンが現るのでクリックして選択状態にし、identifierを設定します。今回は***nextSegue***です。
<img width="1531" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/05e42085-6691-aae6-637c-6544534f3e25.png">

### 6.セグエ遷移のアクションを追加

```swift

import UIKit

class ViewController: UIViewController {

    @IBAction func goBack(_ segue:UIStoryboardSegue) {}
    
    @IBAction func goNext(_ sender:UIButton) {
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView")
        self.present(next,animated: true, completion: nil)
    }

    // セグエ遷移用に追加 ↓↓↓
    @IBAction func goNextBySegue(_ sender:UIButton) {
        performSegue(withIdentifier: "nextSegue", sender: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
```

### 7.ストーリーボード上の部品とソースの紐付け
<img width="1905" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/a801ae9c-6cc6-44b8-8c3c-2e9440de1cbf.png">

ビルドして動作させてみると、presentメソッドによる遷移と同じ挙動であることが確認できます。

### 8.ナビゲーションコントローラを差し込んで見る
この状態からナビゲーションコントローラを差し込んでみます。ストーリーボード上で１画面目のViewControllerを選択し、メニューから、Editor → Embed In → Navigation Controllerと辿ります。
<img width="1731" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/07e297da-7876-9480-9356-fd40345a5f7c.png">

ソースは変更せずビルドして確認すると、セグエでの遷移時と戻る時のアニメーションがスライドになっているのが分かると思います。一方presentメソッドでの遷移はナビゲーションコントローラの影響を受けません。この違いに注意してください。
![segue.gif](https://qiita-image-store.s3.amazonaws.com/0/151314/86914292-f3ec-d21a-877b-1439612a5b98.gif)

スライドのアニメーションはポリシーによりナビゲーションコントローラ配下（Viewスタック管理下）での遷移時にしか使用できません。