web-dev-qa-db-ja.com

prepareForSegueおよびPerformSegueWithIdentifier送信者

タイトルの関数がどのように機能するか、またsenderパラメータについても疑問に思っています。

ボタンのクリックがperformSegueメソッドを呼び出すとしましょう。これは、prepareSegueメソッドも呼び出しますか? prepareSegueメソッドは、performSegueメソッドの前に、ただしボタンが押された後に呼び出されますか?

また、両方の関数の "sender"パラメータはリンクされていますか?文字列をperformSegueメソッドの送信者として渡した場合、それはprepareSegueメソッドの送信者パラメータに転送されますか?つまり、performSegueメソッドの送信者パラメーターを「Hi world」に設定すると、prepareSegueメソッドの送信者パラメーターも同じ文字列になりますか?

ありがとう

8
JasonP

効果的には、セグエをトリガーする方法は2つあります。 1つ目はInterface BuilderのUI要素のアクションによるもの、2つ目はコードでperformSegueWithIdentifier:sender:を使用する方法です。カバーの下でシーンがストーリーボードから読み込まれると、最終的にperformSegueWithIdentifier:sender:を呼び出すアクションハンドラーが構成されているため、「効果的に」と言います

performSegueWithIdentifier:sender:が呼び出されると、segueオブジェクトがビューコントローラーのprepareForSegue:sender:関数に配信されます。

セグエがUI要素のアクションによって開始された場合、送信者はそのUI要素になります(つまり、UIButtonのアクション接続の場合、senderUIButton instance)。

セグエがperformSegueWithIdentifier:sender:を呼び出すコードによって開始された場合、sendersenderとして渡したオブジェクトになります。これは、ビューコントローラー、ボタン、配列など、何でもかまいません。つまり、「Hello World」をperformSegueWithIdentifier:sender:sender値として渡すと、これはprepareForSegue:sender:senderになります。

操作の順序に関して:

  1. performSegueWithIdentifier:senderは、コードまたはUI要素のアクションの結果として呼び出されます
  2. ビューコントローラがshouldPerformSegueWithIdentifier:sender:を実装している場合、この関数が呼び出されます。この関数がfalseを返す場合、セグエはキャンセルされます
  3. セグエオブジェクトと宛先View Controllerオブジェクトが作成されます
  4. ビューコントローラがprepareForSegue:sender:を実装している場合、この関数が呼び出されます。
  5. prepareForSegue:sender:が戻ると、セグエが完了します。
22
Paulw11

PerformSegueメソッドは、ビュー間で実行されるセグエを呼び出します。セグエが実際に行われる前に、prepareForSegueメソッドが呼び出されます。ビュー間でデータを受け渡したい場合は、そこで実行します。

PerformSegueメソッドは、送信するパラメータを受け取りません。それはそもそもセグエを呼び出すためにのみ使用されます。送信するデータはすべてprepareForSegueを介して送信されます。

ここに例があります。

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    performSegueWithIdentifier("test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}

これが役立つかどうか教えてください!

21
The_Curry_Man

The_Curry_Manの答えがうまくいきました。これは、Swift 3.のコードの更新です。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    performSegue(withIdentifier: "test", sender: self)
    //You can set the identifier in the storyboard, by clicking on the segue
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "test"{
        var vc = segue.destinationViewController as! RandomViewController
        vc.data = "Data you want to pass"
        //Data has to be a variable name in your RandomViewController
    }
}
5
Zion Perez

初心者のための私の2セント... Swift 3は:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

}

したがって、到着したコントローラー(クラスMyControllerの)が「fillData」メソッドを実装する場合:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let destController = segue.destination as MyController{

        destController.fillData(...)
    }

}
3
ingconti

Swift 5)の更新されたメソッド

performSegue(withIdentifier: "showNextViewController", sender: self)

注:「showNextViewController」はストーリーボードのセグエに追加される識別子です

0
swiftBoy