prepareForSegue and PerformSegueWithIdentifier sender

橙三吉。 提交于 2019-12-02 21:21:47

There are, effectively, two ways you can trigger a segue. The first is via an action on a UI element in Interface Builder, the second is using performSegueWithIdentifier:sender: in your code. I say 'effectively', because under the covers, when the scene is loaded from the storyboard, an action handler is configured that ultimately calls performSegueWithIdentifier:sender:

When performSegueWithIdentifier:sender: is called, the segue object is delivered to your view controller's prepareForSegue:sender: function.

In the case where the segue was initiated by an action on a UI element then the sender will be that UI element (i.e. if it is an action connection on a UIButton then the sender will be the UIButton instance).

If the segue is initiated by your code calling performSegueWithIdentifier:sender: then the sender will be whatever object you passed as the sender. This could be your view controller, a button, an array, anything. So yes, if you pass "Hello World" to performSegueWithIdentifier:sender: as the sender value then this will be the sender in prepareForSegue:sender:

In terms of the order of operations:

  1. performSegueWithIdentifier:sender is called, either by your code or as a result of an action on a UI element
  2. If your view controller implements shouldPerformSegueWithIdentifier:sender: then this function is called. If this function returns false then the segue is cancelled
  3. The segue object and destination view controller object are created
  4. If your view controller implements prepareForSegue:sender: then this function is called.
  5. Once prepareForSegue:sender: returns, the segue completes.
The_Curry_Man

The performSegue method calls a segue to be performed from one view to another. Before the segue actually takes place, the prepareForSegue method is called, and if you want to pass data between the views, you'd do it there.

The performSegue method doesn't take the parameter you want to send. It's only used to call the segue in the first place. Any data that you want to send will be done through prepareForSegue.

Here's an example.

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
    }
}

Let me know if this helps!

The_Curry_Man's answer worked for me. Here's an update of his code for 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
    }
}
ingconti

my two cents for beginners... In swift 3 is:

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

}

So, if arriving controller (of class MyController) implements a "fillData" method:

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

    if let destController = segue.destination as MyController{

        destController.fillData(...)
    }

}

Updated Method for Swift 5

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

Note : "showNextViewController" is identifier added for segue in storyboard

while sending any object to the particular object to another view controller by using perform segue with an identifier, Please follow the steps #Swift4

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "Detailed_Live_poll"{
        let destinationNavigationController = segue.destination as! UINavigationController
        let targetController = destinationNavigationController.topViewController as! NewLivePollViewController
        targetController.dictQuestInf = sender as! NSDictionary
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!