2016-02-11 9 views
15

私は2つのVCを持っています:VC1とVC2。 VC1では、私はプログラムで作成したfinish buttonを持っています。result array私はVC2に渡したいと思います。SwiftでSegueをプログラムで作成

私はストーリーボードでSegueを作成する方法を知っていますが、finish buttonがプログラムによって作成されて以来、私はこれを行うことができません。

segueを使用して結果配列を渡したい場合、segueをプログラムで作成する方法はありますか?これが不可能な場合は、presentViewControllerを使用してVC2を提示し、代理人をresult arrayにするよう設定する必要がありますか?

+6

VC1からVC2へのインターフェイスビルダーでセグを作成し、名前を付けてボタンに関連付けられたアクションから「performSegueWithIdentifier」を呼び出すことができます。そして、 'prepareForSegue'の中で、あなたが使用しているセグを識別する' if'ステートメントを入れ、VC1から渡しているものをつかんで、VC2とBAMに渡して...完了です。 – Adrian

+0

Adrian、これを回答として投稿して、OPがそれを受け入れるようにしてください。これはOP質問に対する正解です。 –

答えて

26

この回答で提案されたようにすることができます: InstantiateViewControllerWithIdentifier

さらに、リンクの回答がもともとObjective-Cで書かれていたため、Swiftで書き直されたリンク解答のコードを提供しています。

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

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

EDIT:

この答えは、私は別のよりフェイルセーフな方法を提供思ったいくつかの注目を集めているので。上記の答えでは、 "識別子"のタイプがSecondViewControllerではない場合、アプリケーションはクラッシュします。スウィフトではオプションのバインディングを使用してこのクラッシュを防ぐことができます。

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) 

それはタイプSecondViewControllerであればViewControllerがプッシュされるこの方法です。 SecondViewControllerにキャストできない場合、メッセージが印刷され、アプリケーションは現在のViewControllerのままです。

+0

OPはボタンアクションからセグを作成することを尋ねているので、@ UIrianBによって提案されているように、名前付き「UIViewController」を「UIViewController」segueに作成し、それをperformSegueWithIdentifierで呼び出すと、より良い解決策に見えます。 –

+0

@DuncanCは良い点を出しましたが、Dehlenの解決策も働いています:)私は私が推測する2つの異なる方法を学びました。 – Kahsn

+0

こんにちは、これは私のために働いていましたが、キャンセルをクリックして後ろをナビゲートすると、うまくいかないかもしれません。 –

6

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

関連する問題