Dismissing both UINavigation views and Modal views at once programmatically

If you want, in iOS 6.0 (and later) projects you can use an unwind segue. For example, you can:

  1. In your top level view controller (the one you want to unwind to, not the controller you’re going to unwind from), write an unwind segue method, in this case called unwindToTopLevel (personally, I find it useful if the segue bears some indication as to what the destination of the segue is, for reasons that will become apparent when we get to step 3, below):

    - (IBAction)unwindToTopLevel:(UIStoryboardSegue *)segue
    {
        NSLog(@"%s", __FUNCTION__);
    }
    
  2. In the Interface Builder scene from which you will initiate the unwind, control ⌘-drag from the view controller icon to the exit icon to create the unwind segue:

    enter image description here

    Generally you’d define the segue from a button to the exit outlet (and you’re done), but if you want to invoke the segue programmatically, you might want to create it between the controller and the unwind outlet, like shown above.

  3. You’ll get a little pop up that includes the name of your unwind segues (from the presenting controllers … it’s like magic):

    enter image description here

  4. If you’re going to invoke that segue programmatically, you have to select that unwind segue in the document outline on the left side of the IB window and once you’ve done that, you can give the unwind segue a storyboard id:

    enter image description here

    I generally use the name of the the unwind segue for the storyboard id, but you can use whatever you want.

  5. Now, having done that, your alert view can invoke the segue:

    - (IBAction)didTouchUpInsideButton:(id)sender
    {
        [[[UIAlertView alloc] initWithTitle:nil message:@"go home" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil] show];
    }
    
    #pragma mark - UIAlertViewDelegate
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        if (buttonIndex != [alertView cancelButtonIndex])
        {
            [self performSegueWithIdentifier:@"unwindToTopLevel" sender:self];
        }
    }
    

Leave a Comment