How to send data back by popViewControllerAnimated for Swift?

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.


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 ChildViewController
goNext.delegate = self
self.navigationController?.pushViewController(goNext, animated: true)

Method Call

self.delegate?.childViewControllerResponse(parameter)

Tags:

Ios

Swift