popping and pushing view controllers in same action

is is possible to pop a view off the navigation stack and then push another straight onto it?

I’m trying to implement a flat hierarchy for this section and would like to have a segmented controller but I can’t make the segmented controller look anything liked I want, hence why I’m trying to use the navigation controller.

  • Getting the top most UIViewController
  • Load new view when UIProgressView is full
  • Navigation with only Back Button and transparent background
  • Pass data through navigation back button
  • Swift 2: How to Load UITabBarController after Showing LoginViewController
  • UINavigationController: presenting view controller while dismissing another controller is in progress on iPad
  • When a button is clicked I executed this code:

    [[self navigationController] popViewControllerAnimated:YES];
            MapsViewController *aViewController = [[MapsViewController alloc]
                                                   initWithNibName:@"MapsViewController" bundle:nil];
    [self.navigationController pushViewController:aViewController animated:NO];
    [aViewController release];
    

    It’s popping off ok but theres no sign of any pushing! Any help would be appreciated.

    6 Solutions Collect From Internet About “popping and pushing view controllers in same action”

     MapsViewController *aViewController = [[MapsViewController alloc]
                                            initWithNibName:@"MapsViewController" bundle:nil];
         // 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 this controller and replace with another
     [navController popViewControllerAnimated:NO];//not to see pop
    
     [navController pushViewController:aViewController animated:YES];//to see push or u can change it to not to see.
    

    Or

     MapsViewController *aViewController = [[MapsViewController alloc]
                                            initWithNibName:@"MapsViewController" bundle:nil];
    
    
    UINavigationController *navController = self.navigationController;
    
    //Get all view controllers in navigation controller currently
    NSMutableArray *controllers=[[NSMutableArray alloc] initWithArray:navController.viewControllers] ;
    
    //Remove the last view controller
    [controllers removeLastObject];
    
    //set the new set of view controllers
    [navController setViewControllers:controllers];
    
    //Push a new view controller
    [navController pushViewController:aViewController animated:YES];
    

    Taken from https://stackoverflow.com/users/1619554/tomer-peled ‘s solution, so others can find it more easily.

    This appears to be the best way to do it for iOS8:

    UIViewController *newVC = [[UIViewController alloc] init]; // Replace the current view controller 
    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
    [viewControllers removeLastObject]; 
    [viewControllers addObject:newVC]; 
    [[self navigationController] setViewControllers:viewControllers animated:YES];
    

    In Swift:

    let newVc = UIViewController()
    var vcArray = self.navigationController?.viewControllers
    vcArray!.removeLast()
    vcArray!.append(newVc)
    self.navigationController?.setViewControllers(vcArray!, animated: false)
    

    In case newVc exists in a Storyboard:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let newVc = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! UIViewController
    var vcArray = self.navigationController?.viewControllers
    vcArray!.removeLast()
    vcArray!.append(newVc)
    self.navigationController?.setViewControllers(vcArray!, animated: false)
    

    You can use this code to pop or push your controller.

    For objective c

    bool alreadyPushed = false;    
    //Check if the view was already pushed
    NSMutableArray *viewControllers;
    if ( (viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers])) {
    
        for (UIViewController *aViewController in viewControllers) {
    
            if ([aViewController isKindOfClass:[YourControllerName class]]) {
                NSLog(@"pop your view controller");
                [self.navigationController popToViewController:aViewController animated:YES];
                alreadyPushed = true;
                break;
            }
        }
    }
    
    //Push Fresh View
    if( alreadyPushed == false) {
    
        NSLog(@"push your view controller");
        YourControllerName *YourControllerObject = [[YourControllerName alloc]initWithNibName:@"YourNibName" bundle:nil];        
        [self.navigationController pushViewController:YourControllerObject animated:YES];
    
    }
    

    For Swift

      var alreadyPushed = false            
            //Check if the view was already pushed
            if let viewControllers = self.navigationController?.viewControllers {
                for viewController in viewControllers {                    
                    if let viewController = viewController as? YourControllerName {                                               
                        self.navigationController?.popToViewController(viewController, animated: true);                        
                        print(" Push Your Controller")
                        alreadyPushed = true
                        break                        
                    }
                }
            }                        
            if alreadyPushed == false {                
                let YourControllerObject = self.storyboard?.instantiateViewControllerWithIdentifier("YourControllerIdentifire") as! YourControllerName             
                self.navigationController?.pushViewController(YourControllerObject, animated: true)
    
            }
    
    BOOL Present = NO;
    
    fifthViewController * fifthVC = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"];
    
    
    for (UIViewController* viewController in self.navigationController.viewControllers) {
    
        //This if condition checks whether the viewController's class is MyGroupViewController
        // if true that means its the MyGroupViewController (which has been pushed at some point)
        if ([viewController isKindOfClass:[fifthViewController class]] )
        {
    
            // Here viewController is a reference of UIViewController base class of MyGroupViewController
            // but viewController holds MyGroupViewController  object so we can type cast it here
            fifthViewController *groupViewController = (fifthViewController*)viewController;
            [self.navigationController popToViewController:groupViewController animated:NO];
            Present=YES;
        }
    
    }
    
    if(Present==NO)
    {
        [self PushAnimation];
        [self.navigationController pushViewController:fifthVC animated:NO];
    
        Present=YES;
    }
    

    Swift 3.0

    In case someone wants to go deep into the view hierarchy:

                    //Go back to desired viewController and then push another viewController
                    var viewControllers = self.navigationController!.viewControllers
                    while !(viewControllers.last is MyViewControllerClass) {
                        viewControllers.removeLast()
                    }
                    // go to new viewController
                    let anotherViewController = AnotherViewController(nibName: "AnotherViewController", bundle: nil)
                    viewControllers.append(anotherViewController)
                    self.navigationController?.setViewControllers(viewControllers, animated: true)