画面遷移に関係あるコードの記述を別ファイルに分けて実装する

#はじめに
今までの私は、`Main.storyboard`でViewController同士を画面遷移させてました。

ですが、今時は`1つのStoryboardに1つのViewController`が基本で
`Storyboard Reference`を使用して画面遷移します。

というか、そもそも`Storyboardを使用せずにコードで画面遷移`といった流れになってきています。

なので今回はStoryboardを使わず、コードのみで画面遷移を実装しようといった感じです。

じゃあ早速、実装していこう！といってViewControllerに画面遷移のコードを
直接書くとまた新たな問題が浮上してしまいます↓
[節子、それViewControllerやない...、FatViewControllerや...。](https://niwatako.hatenablog.jp/entry/2017/09/15/192705)

では、一体どうすればいいのかというとタイトルにも書いてあるように
`画面遷移に関係あるコードの記述を別ファイルに分けて実装`していきます。

#実装する前に
今回は、コードベースで画面を表示させたいので`Main.storyboard`を削除します。
ですが、ただ削除するだけではエラーになるので色々と設定していきます。

その前に、まずは`SceneDelegate`を今回は使用しないので削除していきます。
[iOS13でSceneDelegateを使わないでアプリを作る](https://qiita.com/u5_03/items/ff005e7cab7ff509f140)

#準備の流れ
では、SceneDelegateを削除したら早速、Main.storyboardを削除していきましょう。

###1.Main.storyboardを削除する
ファイルごと削除したいので、`Move to Trash`を選択します。
![スクリーンショット 2021-02-12 14.16.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743730/ac3c77d4-d581-3d9c-8920-629139a0b232.png)

###2.info.plistの「Main storyboard file base name」を空白にする
最初は、`Main`になっているのでこの部分を空白にしましょう。
 ![スクリーンショット 2021-02-12 14.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743730/124d0a2b-ee5b-ca2f-e15a-9df55e3e962c.png)
これで準備完了です。

#実装していく
まずは、新しく`Router.swift`を作って
そこに`初期画面を表示するメソッド`を記述していきます。

そして、今回は`Storyboard`でアプリ画面を作ります。

```swift:Router.swift
import UIKit

final class Router {
    // 初期画面を表示するメソッド
    static func showRoot(window: UIWindow) {
        let firstVC = UIStoryboard(name: "First", bundle: nil).instantiateInitialViewController() as! FirstViewController
        let navFirstVC = UINavigationController(rootViewController: firstVC)
        window.rootViewController = navFirstVC
        window.makeKeyAndVisible()
    }
}
```
そして、`AppDelegate.swift`にて先ほど作ったメソッドを呼び出します。

```swift:AppDelegate.swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        Router.showRoot(window: window)
        return true
    }
}
```
それが終わったらStoryboardでアプリ画面を作ります。

では、ここでビルドしてみましょう。

自分が作ったアプリ画面が表示されたら成功です！
私はこのような画面にしました。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743730/a773f303-c852-6590-63e2-3bc2f2d722fa.png">

#画面遷移させていく
ボタンをタップしたら画面遷移という感じにします。

まずは、画面遷移先の`SecondViewController.swift`を作ってアプリ画面を作り
`画面遷移するためのメソッド`を先ほど作った`Router.swift`ファイルに記述していきましょう。

更に`前のViewControllerがNavigationControllerを使用していた場合を想定してのメソッド`も同時に作っていきます。

```swift:Router.swift
    // 次の画面に遷移するためのメソッド
    static func showSecond(vc: UIViewController, animated: Bool = true) {
        let secondVC = SecondViewController()
        show(from: vc, to: secondVC)
    }
    // from -> to に画面遷移するメソッド
    // 前のViewControllerがNavigationControllerを使用していた場合を想定して作った
    private static func show(from: UIViewController, to: UIViewController, animated: Bool = true) {
        if let nav = from.navigationController {
            nav.pushViewController(to, animated: animated)
        }else {
            from.show(to, sender: nil)
        }
    }
```
そして、ボタンをタップしたら画面遷移するように実装していきます。

```swift:FirstViewController.swift
    @IBAction private func showSecond(_ sender: UIButton) {
        // SecondViewControllerに画面遷移する
        Router.showSecond(vc: self)
    }
```
こうなれば成功です！
![gifTrasition.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743730/810657a3-bcf7-675c-5bba-44d1f88fef6b.gif)

#おわりに
設定次第では画面遷移方法も自由に変更可能ですので色々、試してみて下さい。

そして私が色々、試したソースコードも[こちら](https://github.com/reo0612/Router_sample)にあげてますので良かったら見てみて下さい。

何か間違っている部分や気になる部分があれば、気軽にコメントして下さると嬉しいです。