Search code examples
iosswiftxcodeseguepopover

Xcode Swift pass String from popover view to main VC


Im trying to pass data from a string in my popOverViewController back to my mainVC as string. But i can't figure out how to do this, so please help anyone.

My mainVC segue func :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "popoverSegue" {
        let popoverViewController = segue.destinationViewController 
        popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
        popoverViewController.popoverPresentationController!.delegate = self

    }
}

My popOverVC:

Im trying to pass the valueSelected back to mainVC

var pickerString = NSArray() as AnyObject as! [String]
var valueSelected = String()

@IBOutlet weak var picker: UIPickerView!

@IBAction func pickButton(sender: AnyObject?) {

    // need to send valueSelected back to previous navigated view
    print("Value: ", valueSelected)
    dismissViewControllerAnimated(true, completion: nil)
}

need to send valueSelected string back to previous navigated view.


Solution

  • For this you can use closures in swift. Here is how to do this:

    FirstViewController.swift

    class FirstViewController: UIViewController
    {
        override func viewDidLoad()
        {
        }
    
        @IBAction func onButtonTap(_ sender: UIButton)
        {
            self.performSegue(withIdentifier: "popoverSegue", sender: self)
        }
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?)
        {
            if segue.identifier == "popoverSegue"
            {
                let popoverViewController = segue.destination as!PopOverViewController
                popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
                popoverViewController.popoverPresentationController!.delegate = self
                popoverViewController.completionHandler = {(valueSelected : String?) in
                    if let valueSelected = valueSelected
                    {
                        print(valueSelected)
                        //Write yout code here
                    }
                }
            }
        }
    }
    

    PopOverViewController.swift

    class PopOverViewController: UIViewController
    {
        var completionHandler : ((String?)->(Void))?
        var pickerString = NSArray() as AnyObject as! [String]
        var valueSelected = String()
    
        @IBAction func pickButton(_ sender: UIButton)
        {
            print("Value: ", valueSelected)
    
            self.dismiss(animated: true, completion: {[weak self] in
                if let handler = self?.completionHandler
                {
                    handler(self?.valueSelected)
                }
            })
        }
    }