How to send data back by popViewControllerAnimated for Swift? How to send data back by popViewControllerAnimated for Swift? ios ios

How to send data back by popViewControllerAnimated for Swift?


You can pass data back using delegate

  1. Create protocol in ChildViewController
  2. Create delegate variable in ChildViewController
  3. Extend ChildViewController protocol in MainViewController
  4. Give reference to ChildViewController of MainViewController when navigate
  5. Define delegate Method in MainViewController
  6. Then you can call delegate method from ChildViewController

Example

In ChildViewController: Write code below...

protocol ChildViewControllerDelegate{     func childViewControllerResponse(parameter)}class ChildViewController:UIViewController{    var delegate: ChildViewControllerDelegate?    ....}

In MainViewController

// extend `delegate`class MainViewController:UIViewController,ChildViewControllerDelegate{    // Define Delegate Method    func childViewControllerResponse(parameter)    {       .... // self.parameter = parameter    }}

There are two options:

A) with Segue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){   let goNext = segue.destinationViewController as ChildViewController   goNext.delegate = self}

B) without Segue

let goNext = storyboard?.instantiateViewControllerWithIdentifier("childView") as ChildViewControllergoNext.delegate = selfself.navigationController?.pushViewController(goNext, animated: true)

Method Call

self.delegate?.childViewControllerResponse(parameter)


If you want to send data by popping, you'd do something like:

func goToFirstViewController() {  let a = self.navigationController.viewControllers[0] as A  a.data = "data"  self.navigationController.popToRootViewControllerAnimated(true)}


Extending Dheeraj's answer in case your ViewController is not first VC in the stack, here is the solution:

func popViewController() {  guard let myVC = self.navigationController?.viewControllers.first({ $0 is MyViewController }) else { return }   myVC.data = "data"  self.navigationController?.popViewController(animated: true)}

However, this solution will break if you have 2 or more than 2 MyViewController in the stack. So, use wisely.