Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UISplitViewController in portrait: how to hide master popover programmatically?

In my UISplitViewController the master controller is a UINavigationController. When in portrait mode I would like to keep the navigation controller visible as long as the user navigates upwards (using the back button). As soon as an item from the table view of the navigation controller is selected, I want to dismiss the popover. How can I achieve this? How can my UITableViewController know if it is inside a popover, and if yes, dismiss itself?

like image 748
Krumelur Avatar asked Apr 19 '11 19:04

Krumelur


1 Answers

Make your main view controller a UISplitViewControllerDelegate (if it isn't already) and wire it up to the UISplitViewController's delegate outlet.

Create a UIPopoverController variable in your main view controller:

// MyViewController.h
@interface MyViewController : UIViewController <UISplitViewControllerDelegate> {
    UIPopoverController *popoverController;
}
@property (retain, nonatomic) UIPopoverController *popoverController;

// MyViewController.m
@synthesize popoverController;

Implement the following UISplitViewControllerDelegate methods:

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

    // Popover controller is visible in portrait
    self.popoverController = pc;
}

// Called when rotating to landscape
- (void)splitViewController:(UISplitViewController*)svc
     willShowViewController:(UIViewController *)aViewController
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {

    // No popover controller in landscape view
    self.popoverController = nil;
}

In your own handler in the main view controller (the one that gets called when a naviation item is selected in the table view):

- (void)navigationControllerSelectedItem:(id)item {
    // If a popover controller is visible, hide it
    if (popoverController) {
        [popoverController dismissPopoverAnimated:YES];
    }
}

And don't forget to release that variable:

- (void)dealloc {
    self.popoverController = nil;
    [super dealloc];
}

Hope that helps!

like image 199
mkerley Avatar answered Nov 15 '22 14:11

mkerley