Search code examples
iosobjective-cios8unwind-segueadaptive-ui

Unwind segue doesn't dismiss adaptive popover presentation when not modal


Update for iOS 9 beta: Apple may have fixed this for iOS 9. If you work(ed) around this issue for iOS 8, make sure it also works correctly on iOS 9.

In storyboard, I've created a popover presentation segue to present a navigation and view controller from a button, as well as creating an unwind segue.

In portrait orientation, the modal (fullscreen) presentation is unwound/dismissed, as expected.

In landscape orientation, the unwind segue also gets called, however the popover presentation is not automatically dismissed.

Did I miss hooking something up? Do I have to dismiss the popover presentation myself?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)__unused sender
{
    if ([[segue identifier] isEqualToString:@"showSelectBookChapter"])
    {
        UINavigationController *navigationController = segue.destinationViewController;

        if ([navigationController.topViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *selectViewController = (BIBLESelectViewController *)navigationController.topViewController;
            selectViewController.initialBookChapterVerse = self.bookChapterVerse;
        }
    }
}

- (IBAction)unwindToBIBLEChapterViewController:(UIStoryboardSegue *)segue
{
    if ([segue.identifier isEqualToString:@"unwindToBIBLEChapterViewController"]) {
        if ([segue.sourceViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *sourceViewController = (BIBLESelectViewController *)segue.sourceViewController;
            self.bookChapterVerse = sourceViewController.selectedBookChapterVerse;
            [self.tableView reloadData];

        }
    }
}

Storyboard scenes and segues Update: After looking at gabbler's sample code, I've narrowed the problem down to popover dismissing fine in a Single View Application, but not in a Master-Detail Application.

Update 2: Here's what the hierarchy looks like (omitting navigation controllers for simplicity's sake), in answer to the question Luis asked:

  • Split view controller
    • Master view controller
    • Detail view controller
      • Chapter view controller (modal page sheet)
        • Select view controller (the problematic popover that unwinds to chapter view controller, but doesn't dismiss)

As I mentioned in the previous update, I created an new master/detail template, and simply presented a popover directly from (a button in) the detail view. It won't dismiss.


Solution

  • I ran into this problem too. I present a View Controller modally (as a form sheet), from the Master View Controller (UISplitViewController). The problem only occurred on the iPad (probably the iPhone 6+ in landscape mode too, but I didn't check it). I ended up doing the following in my unwind action method (using Swift), and it works good.

    if !segue.sourceViewController.isBeingDismissed() {
        segue.sourceViewController.dismissViewControllerAnimated(true, completion: nil)
    }