Swift:Popover解雇回调

May*_*sam 7 uipopovercontroller swift

我的Storyboard中有两个UIViewConrollers:MainViewControllerSecondViewController.当用户点击一个名为Show Popover的按钮时,我将把SecondViewController显示为一个popover:

在此输入图像描述

//MainViewController
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{

    if segue.identifier == "GoToSecondViewControllerSegue"
    {
        var vc = segue.destinationViewController as! SecondViewController
        var controller = vc.popoverPresentationController

        if controller != nil
        {
            controller?.delegate = self
            vc.inputTextDelegate = "I'm a popover!"
        }
    }
}

func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
     println("done")
}

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle
{
    return .None
}
Run Code Online (Sandbox Code Playgroud)
//SecondViewController
@IBAction func dismissPopover(sender: UIButton) {
     dismissViewControllerAnimated(true, completion: nil)
     //This dismisses the popover but does not notify the MainViewConroller
}
Run Code Online (Sandbox Code Playgroud)

segue的锚点连接到一个按钮: 在此输入图像描述

现在我有两个问题:

  1. 当我点击弹出窗口内的取消按钮时,它会解除弹出窗口但不会popoverPresentationControllerDidDismissPopoverMainViewController中触发

  2. 我如何将数据从SecondViewController传递MainViewController,例如UITextView的文本值.

Luk*_*meo 11

或者,更简单地说,当您手动关闭弹出窗口时,只需手动调用iOS的委托方法.

    dismissViewControllerAnimated(true, completion: nil)
    popoverPresentationController?.delegate?.popoverPresentationControllerDidDismissPopover?(popoverPresentationController!)
Run Code Online (Sandbox Code Playgroud)


doo*_*Men 9

您需要将自己设置为popOverDeleagate.这是你必须在目的地的popOverPresentationController中做的.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    segue.destination.popoverPresentationController?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)

然后声明在viewController中实现委托

extension FormViewController: UIPopoverPresentationControllerDelegate {

    func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) {
        printBreadcrumb("Dismissed popover")
    }

}
Run Code Online (Sandbox Code Playgroud)

}


May*_*sam 8

议定书和代表团是解决这些问题的方法.在我的例子中,我定义了一个协议,并将MainViewController与协议相符合.

//SecondViewController
protocol MyDelegate{
    func DoSomething(text:String)
}

class SecondViewController: UIViewController {

 var delegate:GetTextDelegate?

 var inputTextDelegate:String = ""

 override func viewDidLoad() {
    newText.text = inputTextDelegate
 }

 @IBAction func dismissPopover(sender: UIButton) {
        dismissViewControllerAnimated(true, completion: nil)
       //This dismisses the popover but does not notify the  MainViewConroller
 }
 @IBAction func doneButtonAction(sender: UIButton) {
    if let delegate = self.delegate {
        delegate.DoSomething(newText.text)
        self.dismissViewControllerAnimated(true, completion: nil)
    }
 }
}
Run Code Online (Sandbox Code Playgroud)
class MainViewController: UIViewController, UIPopoverPresentationControllerDelegate, MyDelegate {


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {

        if segue.identifier == "GoToSecondViewControllerSegue"
        {
            var vc = segue.destinationViewController as! SecondViewController
            vc.delegate = self
            vc.inputTextDelegate = "I'm a popover!"
        }
    }

    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
        //...
    }

 func DoSomething(text: String) {
     //Do whatever you want
     println(text)
 }

}
Run Code Online (Sandbox Code Playgroud)