Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 273 - Segue(セグエ)

2017年1月20日:Swift 3に向けて改訂*1

Segueとは?

MVCを繋いで表示することができても、内容をコントロールすることはできない。描画をコントロールするのが「Segue」です。

4種類のSegueがあります。

  1. Show
  2. Show Detail
  3. Present Modally
  4. Present As Popover

ストーリーボード上で「Ctrl + ドラッグ」でSegueをつなぐ場合、以下のように一部「deprecated(不採用)」な古いSegueが残っていますが、それは無視します。

f:id:yataiblue:20170121152550j:plain

「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を作ります。

*1:2017年1月15日:Swift 3に向けて改訂中、2016年5月26日改訂:勉強を続けていると理解できるんですね。間違っているところ修正しました。

*2:unwind segueは既存のMVCを消して前に戻すのでちょっと挙動が異なります。