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を作ってする方法など色々あるので、自分のしっくりくる方法でやって見てください^^