Search code examples
iosuisplitviewcontrolleruipopovercontroller

How can I observe when UIPopoverController is dismissed?


UISplitViewController has the delegate method:

-(void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController

I'm looking to obtain functionality from a similar, but non-existent, delegate method:

-(void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willDismissViewController:(UIViewController *)aViewController

Thoughts on the best way to do this considering UISplitViewController/UIPopoverController/UIKit in general aren't KVO compliant, so I can't add an observer to UIPopoverController's isPopoverVisible property.

Thanks

Answer:

//Sent when switching to portrait
- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc
{  
    ...

    self.popoverController = pc;
    [self.popoverController setDelegate:self];
}

-(void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController
{
    NSLog(@"SHOWING POPOVER");
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    NSLog(@"HIDING POPOVER");
}

Solution

  • Figured it out, add the UIPopoverController delegate in addition to the UISplitViewControllerDelegate:

    //Sent when switching to portrait
    - (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController:(UIPopoverController*)pc
    {  
        ...
    
        self.popoverController = pc;
        [self.popoverController setDelegate:self];
    }
    
    -(void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController
    {
        NSLog(@"SHOWING POPOVER");
    }
    
    - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
    {
        NSLog(@"HIDING POPOVER");
    }