iosios9uistoryboardsegueuipopoveruniversal-storyboard

How to detect when a popover is dismissed in iOS 9


I'm updating an app to use universal storyboards. I've created a popover segue to a new viewcontroller using interface builder by dragging from a button to my new viewcontroller and selecting 'Present As Popover' as the kind of segue.

When the user presses outside of the popover (dismissing it) I need to be notified in the presenting view controller so I can undo their actions. How can I do this?

Normally I would have created the popover manually and made my viewcontroller the popover's delegate; allowing me to use the popoverControllerDidDismissPopover delegate call back. However, this is deprecated in iOS9 and even if it wasn't I've no idea where to find the popover so I can set its delegate to my view controller.


Solution

  • Not sure which method you're referring to as being deprecated but you can still use the UIPopoverPresentationControllerDelegate to achieve this. Something like:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let vc = segue.destinationViewController
            sortVC.modalPresentationStyle = .Popover
            sortVC.popoverPresentationController?.sourceRect = filterButton.bounds
            sortVC.preferredContentSize = CGSizeMake(216, 150)
            sortVC.popoverPresentationController!.delegate = self
        }
    }
    

    And then use the

    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)
    

    method to handle its dismissal.