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.
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.
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.
The block to execute after the view controller is dismissed. This block has no return value and takes no parameters.
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.
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];
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With