UISplitViewController in portrait: how to hide master popover programmatically?
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!