34

I need to send some data back from secondView to First View by popView. How can i send back the data by popViewControllerAnimated?

Thanks!

Varis Darasirikul
  • 3,013
  • 5
  • 25
  • 35
  • if you have small data then you can use NSUserDefaluts or NSNotificaitonCenter. – Ashok Londhe Jun 03 '15 at 12:58
  • Related: http://stackoverflow.com/questions/13509832/it-possible-to-pass-data-with-popviewcontrolleranimated – Steve Melnikoff Oct 13 '15 at 09:53
  • here is a TRUE way to use the delegate with popViewControllerAnimated in Swift!: http://stackoverflow.com/questions/39692791/swift-how-to-call-delegate-with-popviewcontroller – David Seek Sep 26 '16 at 11:30

5 Answers5

84

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)
andrzej1_1
  • 1,151
  • 3
  • 21
  • 38
iDhaval
  • 3,175
  • 1
  • 11
  • 21
22

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)
}
DHEERAJ
  • 1,478
  • 12
  • 32
2

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.

itsji10dra
  • 4,603
  • 3
  • 39
  • 59
0

Answer given here is a little complex, quite simple to just use UINavigationControllerDelegate

class FirstNavigationController: UIViewController {
    var value: String?
}

class SecondNavigationController: UIViewController, UINavigationControllerDelegate {

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        guard let vc = navigationController.topViewController as? FirstNavigationController else { return }
        vc.value = "Hello again"
    }
}
Joe Maher
  • 5,354
  • 5
  • 28
  • 44
0
self.navigationController?.popViewController(animated: true)
        let vc = self.navigationController?.viewControllers.last as! MainViewController
        vc.textfield.text = "test"


this popviewcontroller solutions

ayhnhakn
  • 107
  • 3
  • 8