ssk blog

バンコクで働くエンジニアのメモ

swiftで画面遷移の方法どうする?Segueって使うの?

[Swiftを書き始めたときに悩んだことシリーズ]

Swiftを書き始めたときに[swift][画面遷移] で検索すると『segueを使った画面遷移の方法』などがでてきて、「segueって使うの?」ってなりました。

画面遷移をする方法を大きく分けると
- segueを使う
- コードで書く

周りのiOSエンジニアに聞いたら、業務でsegueを使っているところは、ほぼありませんでした。
シンプルな個人アプリとかを作るんだったら良いけど...
複数人で開発をするなら「1Storyboard + 1ViewController」のルールでコードを使って実装するのが良いと思います。

ゴリゴリに書く方法
class FirstViewController: UIViewController {
  @IBAction func tapNext(_ sender: Any) {
    let storyboard = UIStoryboard(name: String(describing: SecondViewController.self), bundle: nil)
    let vc = storyboard.instantiateInitialViewController()!
    navigationController?.pushViewController(vc, animated: true)
  }
}
問題点

- 遷移先にデータを渡すときにpublicな変数を作って渡す??? -> 良くない
- ごちゃごちゃしている


Androidで画面遷移を実装するときは、遷移先でstaticメソッドを作ってIntentを作成/取得して、遷移元は呼び出すようにしていました。
そのやり方が良いと思うので、iOSでも自分は以下のように実装しています。

自分がやっている実装方法

遷移元

class FirstViewController: UIViewController {
  @IBAction func tapNext(_ sender: Any) {
    let vc = SecondViewController.instantiate()
    navigationController?.pushViewController(vc, animated: true)
  }
}


遷移先

class SecondViewController: UIViewController {
 static func instantiate(): SecondViewController {
  let vc = StoryboardUtil.instantiate(self)
 return vc
    }
}

UIViewControllerを取得するための便利クラス

class StoryboardUtil {
 static func instantiate<T: UIViewController>(_ type: T.Type) -> T {
     let sb = UIStoryboard(name: String(describing: type), bundle: Bundle.main)
     let vc = sb.instantiateInitialViewController() as! T
     return vc
    }
}

こっちの方がスッキリ書けて良いと思います。
UIViewControllerを取得する方法は、protocolを作ってする方法など色々あるので、自分のしっくりくる方法でやって見てください^^