Question

I have created Master detail application with multiple detail view controllers connected to a split view via replace segue. On landscape orientation everything works fine, but on portrait orientation I am missing button to open masters table view and swipe on left side of the screen is not working and not opening master side of the app.

EDIT:

In my DetailViewController I have two methods, same as in template provided by xcode for master-detail app:

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"MasterButton", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and    popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}

EDIT 2: On change of my detailViewController, I change delegate too.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *destinationViewController = [segue destinationViewController];
    if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) {
        self.splitViewController.delegate = (id)destinationViewController;
    }
    else {
        self.splitViewController.delegate = nil;
    }
}

EDIT 3: I finally resolved my issue by adding this line of code in every DetailViewController that I created:

self.splitViewController.delegate = self;
Was it helpful?

Solution

You need place barButtonItem from

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc

at detail view controller's navigationBar.

OTHER TIPS

1) This is for the bar button:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{

    self.popoverController = popoverController;

    barButtonItem.title = NSLocalizedString(@"List", @"List");

   [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

    self.masterPopoverController = popoverController;
}

2) and if you want to add UIButton then try below:

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{

    self.popoverController = popoverController;

    UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
    [btn setImage:[UIImage imageNamed:@"list.png"] forState:UIControlStateNormal];
        //[btn setImage:[UIImage imageNamed:@"list.png"] forState:UIControlStateHighlighted];
    [btn setFrame:CGRectMake(0, 0, 50, 30)];
    [btn addTarget:barButtonItem.target action:barButtonItem.action forControlEvents:UIControlEventTouchUpInside];

    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithCustomView:btn];
    self.masterPopoverController = popoverController;

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top