【Swift】異なるStoryboard間での画面遷移、値渡しの方法

社内でiOSアプリ開発初心者に、
StoryboardをViewController単位で分けた場合の画面遷移、値渡し方法の説明時サンプルとして残しておく
#環境
- Xcode: 11.3.1
- Swift5

#・遷移先のUIViewController、StoryBoardを作成する

####UIViewControllerを作成
1. プロジェクトナビケータを右クリックし、New Fileを選択
2. Cocoa Touch Classを選択
3. ___Class:___ NextViewController、 ___Subclass of:___ UIViewController、 ___Also Create XIB File:___ チェック外す、 ___Language：___Swift
4. Nextを選択
5. そのままCreateでOK

####StoryBoardを作成
1. プロジェクトナビケータを右クリックし、New Fileを選択
2. Storyboardを選択
3. Nextを選択
4. ファイル名を「Next」にし、CreateでOK

以下4つが並んでいればOK
ViewController.swift
NextViewController.swift
Next.storyboard
Main.storyboard

###Next.storyboardにViewControllerを設置、紐付け
1. 画面右上のLibraryを選択し、View Controllerをドラッグし、StoryBoard上に表示する
![スクリーンショット 2020-06-18 13.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/567621f8-72b1-d363-24d5-f59062bacab1.png)
2. 1で追加したViewControllerを選択した状態で、Identity Inspectorを開く
3. Custom Class のClass欄にNextViewControllerと入力し、Enter!
4. Attributes Inspectorを開き、Is Initial View Controllerにチェックをいれる

以下のようになっていればOK
![スクリーンショット 2020-06-18 14.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/3f2c2155-7dfd-b0b3-3245-03b475f3d83e.png) ![スクリーンショット 2020-06-18 14.20.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/402983f7-7bd1-1bb4-9c6b-90ee684b1cb9.png)

#・ViewController.swiftに画面遷移処理を書く
```Swift:ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let vc = storyboard.instantiateInitialViewController() {
            self.present(vc, animated: true, completion: nil)
        }
    }
```
※事前にMain.storyboard内のViewControllerにUIButtonを設置し、ソースコードと紐付けしておいて下さい。
※紐付けの際はIBActionで、function名はお任せします

###この時点で動作確認
![nextGif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/665d8515-79ad-b7f4-73b8-cf5d323934e1.gif)

#・画面遷移の際に、値も渡したい
ViewController.swiftを以下のように書き換え

```Swift:ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let vc = storyboard.instantiateInitialViewController(), let nextVc = vc as? NextViewController {
            // NextViewControllerのメンバ変数valueに文字列を代入
            nextVc.value = "私は二郎系ラーメンが大好きです！"
            self.present(vc, animated: true, completion: nil)
        }
    }
```
NextViewController.swiftを以下のように記載

```Swift:NextViewController.swift
class NextViewController: UIViewController {
    
    @IBOutlet weak var dispLabel: UILabel!
    var value: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 受け取った値をUILabelで表示
        self.dispLabel.text = self.value
    }
}
```
※事前にNext.storyboard内のViewControllerにUILabelを設置し、ソースコードと紐付けしておいて下さい。

###動作確認
![nextgif2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/47319135-2b18-3d4c-be87-1862c15af435.gif)
ViewController.swiftから値を渡すことができました！

#・遷移先がNavigationControllerを使用している場合
![スクリーンショット 2020-06-18 16.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656690/8738c2d5-c659-7016-ce20-6e7813c5f4bf.png)
上記のように遷移先のNextViewControllerがNavigationControllerを使用していた場合、
前述のままでは値を渡すことができません。
ではどうするのか・・・

```Swift:ViewController.swift
    @IBAction func didTapNextButton(_ sender: UIButton) {
        // ここに画面遷移処理(NextViewControllerに遷移する処理)を記載
        let storyboard: UIStoryboard = UIStoryboard(name: "Next", bundle: nil)
        if let navigationVc = storyboard.instantiateInitialViewController() as? UINavigationController,
            let nextVc = navigationVc.topViewController as? NextViewController {
            nextVc.value = "私は二郎系ラーメンが大好きです！"
            self.present(navigationVc, animated: true, completion: nil)
        }
    }
```
storyboardから取得できるのはUINavigationControllerになるので、
NavigationControllerの最前面にあるViewController(NextViewController)を取得してあげましょう。