Xcode Swift 将字符串从弹出窗口视图传递到主视图 VC

Xcode Swift pass String from popover view to main VC

我正在尝试将 popOverViewController 中字符串中的数据作为字符串传递回我的 mainVC。但我不知道该怎么做,所以请帮助任何人。

我的 mainVC segue 函数:

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

    }
}

我的 popOverVC:

我正在尝试将 valueSelected 传递回 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.

如果你想使用委托

添加协议

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

给popOverVC添加弱类型Delegate,并在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)
}

对 MainVC 实施 SelectDelegate

class MainVC {

. . .

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

将 popOverVC 的委托分配给 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
    }
}

为此,您可以在 swift 中使用 closures。以下是如何做到这一点:

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