Search code examples
iosipaduisplitviewcontrolleruipopovercontroller

iPad SplitViewController Show Popover programmatically


I have an iPad SplitViewController application in which I hide the left pane in both portrait and landscape modes. I need to show the left pane in its popover when a certain notification is received by the application. Despite experimenting with a number of different suggested solutions I am struggling to work out how to achieve this.

I am using a MultipleMasterDetailManager implementation that includes the following code:

/* forward the message to the current detail view
 * all detail views must implement UISplitViewControllerDelegate
 */
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
    self.masterBarButtonItem = barButtonItem;
    self.masterPopoverController = pc;

    barButtonItem.title = NSLocalizedString(@"Show Sidebar", @"Show Sidebar");

    [self.currentDetailController.navigationItem setLeftBarButtonItem:self.masterBarButtonItem animated:YES];
}

/* forward the message to the current detail view
 * all detail views must implement UISplitViewControllerDelegate
 */
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    //if (![self.currentDetailController isKindOfClass:[SyncSourceDetailViewController class]])
    //{
        self.masterBarButtonItem = nil;
        self.masterPopoverController = nil;

        [self.currentDetailController.navigationItem setLeftBarButtonItem:nil animated:YES];    
    //}    
}

Similar methods exist in the detail view controllers themselves.

The method that I'm calling when the notification is received is as follows:

- (void)navigateToLatest 
{   
        [self navigateToDocumentsTab];  
        [[self dataLoader] navigateToLatest];  // populates data for the left table view 
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UIView *view = [[[[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] view];  

        [self.masterDetailManager.masterPopoverController presentPopoverFromRect:CGRectMake(0, 0, 100, 100) inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

This does not work. I've also tried using the presentPopoverFromBarButtonItem method but I cannot seem to locate the leftBarButtonItem in code.

Maybe I am going about this completely the wrong way.


Solution

  • I ended up solving this problem by setting a "showSidebar" variable in my app delegate to true in the navigateToLatest method. Then in my DetailViewController's ViewDidAppear event I check the value of this variable, if it is true then I show the sidebar using the following code:

    UIPopoverController *masterPopoverController= [[theAppDelegate masterDetailManager] masterPopoverController];
            [masterPopoverController presentPopoverFromBarButtonItem:[self.navigationItem leftBarButtonItem] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
            [theAppDelegate setShowSidebar:NO];