Reputation: 63
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
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
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