Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

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.

like image 925
Josh Avatar asked Jul 29 '11 12:07

Josh


People also ask

How do I pop two viewControllers at a time?

There's also a setViewControllers(_:animated:) to include the pop animation. Alternatively you could find the second last view controller in the viewControllers array and then use popToViewController to avoid overwriting the entire view controller stack.

How do I push from present view controller?

VC3 -> present VC2 -> VC1VC2 needs to be in a UINavigationController then after you present it you can push VC3. The back button will work as expected on VC3, for VC2 you should call dismiss when the back button is pressed. Try implementing some of that in code and then update your question.

What happens when you dismiss a view controller?

The block to execute after the view controller is dismissed. This block has no return value and takes no parameters.

What does pop view controller do?

Pushes a view controller onto the receiver's stack and updates the display. func popToRootViewController(animated: Bool) -> [UIViewController]? Pops all the view controllers on the stack except the root view controller and updates the display.


2 Answers

 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]; 
like image 113
Vijay-Apple-Dev.blogspot.com Avatar answered Sep 19 '22 08:09

Vijay-Apple-Dev.blogspot.com


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) 
like image 21
Rodrigo Pinto Avatar answered Sep 18 '22 08:09

Rodrigo Pinto