iphoneipaduiviewcontrolleruinavigationcontrolleripod

How do I pop the view controller underneath a pushed view controller?


I want to push a view controller onto the stack, then pop the first one that pushed the new one.

-(void) someMethod {
    MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init];
    [self.navigationController pushViewController:tempVC animated:YES];
    [tempVC release];

    // pop this VC, how?
}

EDIT: turns out I can pop back 2 view controllers instead once finished with the new VC. Still not what I wanted exactly, but it works. The downside is I need to set a flag to indicate that the covered view is completed.


Solution

  • Here's a technique of popping back two view controllers, which has a similar problem of yours of the current view controller and its navigationController property going away as soon as you do the first pop:

    // pop back 2 controllers on the stack to the setup screen
    //
    
    // locally store the navigation controller since
    // self.navigationController will be nil once we are popped
    //
    UINavigationController *navController = self.navigationController;
    
    // retain ourselves so that the controller will still exist once it's popped off
    //
    [[self retain] autorelease];
    
    // Pop back 2 controllers to the setup screen
    //
    [navController popViewControllerAnimated:NO];
    [navController popViewControllerAnimated:YES];
    

    alternatively, you can directly "party" on the navigation controllers stack of view controllers:

    setViewControllers:animated: Replaces the view controllers currently managed by the navigation controller with the specified items.

    • (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated Parameters viewControllers The view controllers to place in the stack. The front-to-back order of the controllers in this array represents the new bottom-to-top order of the controllers in the navigation stack. Thus, the last item added to the array becomes the top item of the navigation stack. animated If YES, animate the pushing or popping of the top view controller. If NO, replace the view controllers without any animations. Discussion You can use this method to update or replace the current view controller stack without pushing or popping each controller explicitly. In addition, this method lets you update the set of controllers without animating the changes, which might be appropriate at launch time when you want to return the navigation controller to a previous state.

    If animations are enabled, this method decides which type of transition to perform based on whether the last item in the items array is already in the navigation stack. If the view controller is currently in the stack, but is not the topmost item, this method uses a pop transition; if it is the topmost item, no transition is performed. If the view controller is not on the stack, this method uses a push transition. Only one transition is performed, but when that transition finishes, the entire contents of the stack are replaced with the new view controllers. For example, if controllers A, B, and C are on the stack and you set controllers D, A, and B, this method uses a pop transition and the resulting stack contains the controllers D, A, and B.

    Availability Available in iOS 3.0 and later. Declared In UINavigationController.h

    So, to "disappear" the view controller directly under you on the navigation stack, in your view controller's viewDidLoad, you could do this:

    NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy];
    [VCs removeObjectAtIndex:[VCs count] - 2];
    self.navigationController.viewControllers = VCs;