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!