Swift:Popover解雇回调

时间:2015-08-12 13:36:56

标签: swift uipopovercontroller

我的故事板中有两个 UIViewConrollers MainViewController SecondViewController 。当用户点击名为 Show Popover 的按钮时,我将显示 SecondViewController 作为弹出窗口:

enter image description here

//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
}
//SecondViewController
@IBAction func dismissPopover(sender: UIButton) {
     dismissViewControllerAnimated(true, completion: nil)
     //This dismisses the popover but does not notify the MainViewConroller
}

segue的锚点连接到一个按钮: enter image description here

现在我有两个问题:

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

  2. 中触发popoverPresentationControllerDidDismissPopover
  3. 如何将数据从 SecondViewController 传递到 MainViewController ,例如UITextView的文本值。

4 个答案:

答案 0 :(得分:11)

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

    dismissViewControllerAnimated(true, completion: nil)
    popoverPresentationController?.delegate?.popoverPresentationControllerDidDismissPopover?(popoverPresentationController!)

答案 1 :(得分: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)
    }
 }
}
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)
 }

}

答案 2 :(得分:8)

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

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

然后声明在viewController

中实现委托
extension FormViewController: UIPopoverPresentationControllerDelegate {

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

}

答案 3 :(得分:-1)

我遇到同样的问题,并在Apple API中找到答案。

关于功能popoverPresentationControllerDidDismissPopover,他们说The popover presentation controller calls this method after dismissing the popover to let you know that it is no longer onscreen. The presentation controller calls this method only in response to user actions. It does not call this method if you dismiss the popover programmatically.

所以我们必须自己做。

你可以选择像@Maysam那样更重的块或代表。 这是我使用块FYI的方式。

让我们只关注关键功能。

class SecondViewController: UIViewController {

var dismissPopover: (() -> Void)?

deinit {
    if let block = self.dismissPopover {
        block()
    }
}

 @IBAction func dismissPopover(sender: UIButton) {
        dismissViewControllerAnimated(true, completion: nil)
       //This dismisses the popover but does not notify the  MainViewConroller
 }
}

我做了一个区块,然后把它称为第二个VC deinit。

class MainViewController: UIViewController, UIPopoverPresentationControllerDelegate, MyDelegate {


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

        if segue.identifier == "GoToSecondViewControllerSegue"
        {
            var vc = segue.destinationViewController as! SecondViewController
            vc..dismissPopover = {
                [unowned self] () in
                self.DoSomehing()
                // call your method...
            }
        }
    }


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

}

在prepareForSegue:方法和完成中设置块。