VC1とVC2の2つのVCがあります。 VC1では、finish button
私がプログラムで作成したものとresult array
VC2に渡したい。
ストーリーボードでセグエを作る方法は知っていますが、finish button
はプログラムで作成されます。
セグエを使用して結果配列を渡したい場合、プログラムでセグエを作成する方法はありますか?これが不可能な場合、presentViewController
を使用してVC2を提示し、デリゲートを設定してresult array
?
この答えで提案されているようにそれを行うことができます: 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
に残ります。
VC1からVC2にドラッグすることで、Interface Builderでセグエを作成できます。VCの上部にある小さな黄色の円から/にドラッグするだけです。このセグエにIBで一意の名前を付けると、finish
関数でperformSegueWithIdentifier:
を呼び出して、セグエの名前を渡すことができます。 prepareForSegue
メソッドでは、segue.identifier
にアクセスすることにより、実行されているセグエを見つけることができ、それが問題のセグエである場合は、segue.destinationViewController
へのポインタを取得し、そのデータを渡すことができます方法。