How to send data back by popViewControllerAnimated for Swift?

后端 未结 4 1010
说谎
说谎 2020-11-29 03:42

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

Thanks!

相关标签:
4条回答
  • 2020-11-29 03:58

    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.

    0 讨论(0)
  • 2020-11-29 03:59

    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)
    
    0 讨论(0)
  • 2020-11-29 04:01

    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)
    }
    
    0 讨论(0)
  • 2020-11-29 04:01

    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"
        }
    }
    
    0 讨论(0)
提交回复
热议问题