How to send data back by popViewControllerAnimated for Swift?
You can pass data back using delegate
- Create
protocol
inChildViewController
- Create
delegate
variable inChildViewController
- Extend
ChildViewController
protocol inMainViewController
- Give reference to
ChildViewController
ofMainViewController
whennavigate
- Define
delegate
Method inMainViewController
- Then you can call
delegate
method fromChildViewController
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)
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.