Swiftで遊ぼう! - 273 - Segue(セグエ)
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- 初心者はここから!-> 50オヤジでもできるiOS開発
- 私の本業、オフィシャルなブログ-> Life-LOG
- Swift 3 対応
2017年1月20日:Swift 3に向けて改訂*1
Segueとは?
MVCを繋いで表示することができても、内容をコントロールすることはできない。描画をコントロールするのが「Segue」です。
4種類のSegueがあります。
- Show
- Show Detail
- Present Modally
- Present As Popover
ストーリーボード上で「Ctrl + ドラッグ」でSegueをつなぐ場合、以下のように一部「deprecated(不採用)」な古いSegueが残っていますが、それは無視します。
「Show Detail」は「Split View Controller」のDetailを表示するとき、もしくは「Navigation Controller」でpushしてViewControllerを表示する時に使います。
ます、Segueの理解で重要なのところは、新しいMVCのインスタンスが作られるというところです。既存のMVCに変化を加える訳ではありません。Segueが呼ばれると古いMVCは消され、新しいMVCが作られることで変化が見えるんですt*2。
じゃあどうやってSegueを使うのでしょう?
ストーリーボードでSegueのインスタンス化
ViewControllerからViewControllerへ「Ctrl + ドラッグ」すればいいんです。
ポップアップウインドウが出現するのでSegueを選べばいいだけです。
こうしたらUIStoryboardSegueクラスインスタンスがPsychologistViewControllerのプロパティ(一般的にVIewControllerのプロパティ)として作られます。ここで新しいMVCを作るためにIdentifierを設定する必要があります。
コードでSegueのインスタンス化
UIViewControllerが持っている次のメソッドを使います。
func performSegue(withIdentifier identifier: String, sender: Any?) { // code }
何度も言いますが、「Ctrl + ドラッグ」でSegueを設定する場合、このメソッドは必要ありません。
ストーリーボードでセグエをインスタンス化する場合、このコードを知る必要は無いのですが、iOSデベロッパーとしてセグエ(Segue)の制御するコードを知っておくべきです。
UIViewControllerから、このメソッドにidentifierを引数として渡し、Segueを作るのですが、senderは基本的になんでもかまいません。このSegueを発動させるオブジェクトになるので、一般的にUIButtonオブジェクトになるでしょう。しかし、ボタンでなくてもかまわないのでAnyというわけです。
セグエ(Segue)がインスタンス化したら後は共通
新しいMVCを作り出すために、UIViewControllerが持っている次のメソッドにSegueインスタンスを引数として渡す必要があります。
func prepare(for segue: UIStoryboardSegue, sender: Any?) { // code }
ここにメソッドが送られると、Segueインスタンスの持つ次のメソッドを使ってMVCができるんです。
func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let identifier = segue.identifier { switch identifier { case "Show Detail": if let vc = segue.destination as? DetailViewController { vc.propaerty1 = ... vc.callMethodToSedItUp(...) } default: break } } }
Segueのプロパティに「destination」というUIViewControllerがあり、これを使って新しいMVCを作ります。