storyboardを使わずに画面遷移をして値を渡す方法【Swift5】

こんな感じにストーリボード上でセグエを引かなくでも画面遷移ができるようにしたい
とりあえず今回は「1」のボタンを押せば「１」が、「２」を押せば「２」が遷移先のラベルに表示するようにする
<img width="543" alt="スクリーンショット 2019-08-07 11.04.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/f8f892d2-43fe-59fb-81b8-67da39a7eb60.png">

# ~準備~
コードをいじる前の準備
## 遷移先のViewControllerにIDをつける
まず最初に遷移先のViewControllerのStoryboardIdを決める
<img width="260" alt="スクリーンショット 2019-08-07 10.56.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/bfd6055a-58ae-938e-1a40-4942fdd457f1.png">

## 遷移先のViewController用のファイルを作る
⌘+nで新規ファイルを作る。
<img width="729" alt="スクリーンショット 2019-08-07 11.12.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/393f5a1c-2d4a-6b54-27cd-c7fac8ad13ac.png">
「Cocoa Touch Class」を選択
<img width="730" alt="スクリーンショット 2019-08-07 11.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/11a5bbdf-2140-a374-a82c-6f29398b4c61.png">
今回はSubclassを「UIViewController」と選択する。
Class欄は自由にどうぞ

## 遷移元、遷移先それぞれのファイルを設定する
今回は遷移元を「ViewController.swift」、遷移先を「SecondViewController.swift」とした。
・遷移元
<img width="259" alt="スクリーンショット 2019-08-07 11.17.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/be2f961f-694f-c619-93b3-c31bfc8ed09b.png">
・遷移先
<img width="258" alt="スクリーンショット 2019-08-07 11.18.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/4d56d6d3-f530-5ec3-173e-8c561a3be8c2.png">

準備終了。ようやくコードをいじる

# ファイルをいじる
## 遷移元
### ボタンとコードを結びつける
今回はConnectionをAction
TypeをUIButtonとして結びつけた。
<img width="257" alt="スクリーンショット 2019-08-07 11.27.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/e3adde51-22f0-a86a-2d3f-3be7f1e92cd4.png">
二個目以降は、下の画像みたいにすでに結びつけたボタンアクションの上に、別のボタンを持っていくと複数のボタンを同じアクションでまとめることができる。
<img width="874" alt="スクリーンショット 2019-08-07 11.27.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/51037784-dd43-d698-7240-c3a313d6e79e.png">
ViewControllerを選択してConnection inspectorを覗くと「Received　Actions」でちゃんと２つとも繋がっていることが確認できる
<img width="255" alt="スクリーンショット 2019-08-07 11.33.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/f4ec12cd-357f-3b6c-2434-a2d856665fe1.png">

### 遷移元のコードをいじっていく
ここからコードをゴリゴリ書いていく
まずは遷移元のコードから

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // どちらかのボタンを押した時に動く
    @IBAction func pushButton(_ sender: UIButton) {
        
        // 押されたボタンを格納
        let button: UIButton = sender
        
        // ボタンのタイトルを取得
        guard let giveValue = button.currentTitle else {
            return
        }
        
        // 以下、遷移に関する処理
        // 自身のストリーボードを格納
        let selfStoryboard: UIStoryboard = self.storyboard!
        
        // 画面の遷移
        let nextView = selfStoryboard.instantiateViewController(withIdentifier: "secondViewController")
        navigationController?.pushViewController(nextView, animated: true)
        
        // SecondViewController型のViewControllerを格納
        let nextVC: SecondViewController = nextView as! SecondViewController
        // 遷移先に値を渡す
        nextVC.receiveValue = giveValue
    }  
}
```
### 説明（みたいなもの）
上から順に軽く説明すると以下のことをしている（と思われる・・・）

- ボタンを押した時、`sender`に押したボタンオブジェクトが丸々乗っかる
- それをUIButton型の定数`button`に代入する（ボタンとコードを結びつけた時TypeをUIButtonにしたのはこのため）
- `button`のタイトル(取得したい値)をoptional bindingしながら`giveValue`に格納(optional bindingしたのでgiveValueは単純なString型)
- `selfStoryboard`にはViewController（遷移元）のストーリボードを格納（していると思われる。）
- ```selfStoryboard.instantiateViewController(withIdentifier: "secondViewController")```
の```"secondViewController"```には一番最初に決めたStoryboardのIDを書く
- `SecondViewController`型の`nextVC`には次に表示したいViewControllerが入っている。
- `nextVC`（`SecondViewController`型）の変数`receiveValue`にボタンのタイトルが入っている`giveValue`を代入する。

これで画面遷移した時に、ボタンのタイトルが遷移先に渡されるようになったはず

## 遷移先
ここからSecondViewController.swiftで作業するよ
### ラベルとコードを結びつける
<img width="804" alt="スクリーンショット 2019-08-07 12.25.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/0af70500-60f6-f1c3-539c-25cd53f6c0b3.png">

### コードをちょっと書く
まじで少しだけ
少し過ぎてビビる

```swift:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {
    
    // 遷移元から渡される値を入れるためのもの
    var receiveValue: String = ""
    
    // 結果を表示するラベル
    @IBOutlet weak var resultLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
         // ラベルに受け取った値を表示させる
        resultLabel.text = receiveValue
        
    }
}
```
### 説明（みたいなもの）

- `receiveValue`：遷移元で受け取る情報を入れてもらうための変数。
- `resultLabel`の中身（テキスト）を受け取った`receiveValue`にする。

#　完成
一応これで完成です。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/55903578-765f-4537-6341-200894b547fd.gif)