web-dev-qa-db-ja.com

Swiftでプログラムでセグエを作成する

VC1とVC2の2つのVCがあります。 VC1では、finish button私がプログラムで作成したものとresult array VC2に渡したい。

ストーリーボードでセグエを作る方法は知っていますが、finish buttonはプログラムで作成されます。

セグエを使用して結果配列を渡したい場合、プログラムでセグエを作成する方法はありますか?これが不可能な場合、presentViewControllerを使用してVC2を提示し、デリゲートを設定してresult array

17
Kahsn

この答えで提案されているようにそれを行うことができます: InstantiateViewControllerWithIdentifier

さらに、Swift=で書き換えられたリンクされた回答のコードを提供しています。これは、リンクの回答が元々Objective-Cで作成されたためです。

let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as! SecondViewController

vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)

編集:

この回答にはいくつかの注意が向けられているため、別のより安全な方法を提供すると思いました。上記の回答では、ViewController with "identifier"SecondViewController型でない場合、アプリケーションはクラッシュします。 Swiftでは、オプションのバインディングを使用してこのクラッシュを防ぐことができます。

guard let vc = UIStoryboard(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("identifier") as? SecondViewController else {
    print("Could not instantiate view controller with identifier of type SecondViewController")
    return
}

vc.resultsArray = self.resultsArray
self.navigationController?.pushViewController(vc, animated:true)

これにより、ViewController型の場合、SecondViewControllerがプッシュされます。 SecondViewControllerにキャストできない場合、メッセージが出力され、アプリケーションは現在のViewControllerに残ります。

28
dehlen

VC1からVC2にドラッグすることで、Interface Builderでセグエを作成できます。VCの上部にある小さな黄色の円から/にドラッグするだけです。このセグエにIBで一意の名前を付けると、finish関数でperformSegueWithIdentifier:を呼び出して、セグエの名前を渡すことができます。 prepareForSegueメソッドでは、segue.identifierにアクセスすることにより、実行されているセグエを見つけることができ、それが問題のセグエである場合は、segue.destinationViewControllerへのポインタを取得し、そのデータを渡すことができます方法。

8
creeperspeak