Flev40
Flev40

Reputation: 63

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.

Upvotes: 2

Views: 653

Answers (2)

PGDev
PGDev

Reputation: 24341

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)
            }
        })
    }
}

Upvotes: 1

Cruz
Cruz

Reputation: 2632

If you want to use Delegate

add Protocol

protocol SelectDelegate: NSObjectProtocol {
    func select(_ string: String)
}

add weak type Delegate to popOverVC and use it before dismissViewController

var pickerString = NSArray() as AnyObject as! [String]
var valueSelected = String()
weak var delegate: SelectDelegate?

@IBOutlet weak var picker: UIPickerView!

@IBAction func pickButton(sender: AnyObject?) {
    print("Value: ", valueSelected)

    //added Line
    delegate?.select(valueSelected)
    dismissViewControllerAnimated(true, completion: nil)
}

implement SelectDelegate to MainVC

class MainVC {

. . .

    func select(string: String) {
        //doSometing popupVC's string
    }    
}

assign popOverVC's delegate to mainVC

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

Upvotes: 0

Related Questions