Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I remove a view from navigation controller

I want to call a new view controller and remove the current view controller from the navigation controller stack. For example. I am in view controller A and I call B.

Now I have in the stack A , B. Now I want to call C (from B). I want the stack to be A, C.

Thanks.

like image 426
Tony Avatar asked Dec 21 '11 14:12

Tony


People also ask

How do I dismiss a present view controller in Swift?

Try to use modal. If you use push, you should dismiss it with the pop method of the navigation controller.

How do I delete a view controller from storyboard?

To delete the View Controller from the storyboard, select the View Controller by clicking the Show Document Outline icon and then clicking on View Controller Scene in the Document Outline. Then press Backspace or choose Edit > Delete.


3 Answers

In the context of ARC, here's a possible solution:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController];
[self.navigationController setViewControllers:navArray animated:YES];

As you can tell, this code replaces the usual push code in the view you're trying to remove from stack ("B," in your question). Line 1 copies the list of view controllers from the nav-controller stack into an NSMutableArray. Line 2 replaces the last (topmost) view with the view we want to go to next ("C"). Line 3 makes the actual nav-controller's stack to be our altered array, and animates the transition to the topmost item. (Of course you can't use this code in the root viewController.)

I found an alternative way here and adapted it for ARC:

UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:someViewController animated:YES];

The first line is needed because once you've popped the current view off the stack, self.navigationController will be nil and the third line won't work. Same number of lines as the previous way, but this way works through built-in methods instead of "manually" fiddling with the stack.

like image 94
JohnK Avatar answered Oct 04 '22 01:10

JohnK


This is the answer.

The following code pops the current view controller.

UINavigationController *navController = self.navigationController;
// retain ourselves so that the controller will still exist once it's popped off
[[self retain] autorelease];
[navController popViewControllerAnimated:NO];

And this pushes the new one:

ViewControllerC *viewC = [[ViewControllerC alloc] init];
[navController pushViewController:viewC animated:TRUE];

Hope it helps!

like image 22
Tony Avatar answered Oct 03 '22 23:10

Tony


To remove the second-from-last navigation item:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers];
[navigationStack removeObjectAtIndex:[navigationStack count] - 2];
self.navigationController.viewControllers = navigationStack;

For example, run this from viewDidLoad on controller C to remove controller B from the navigation stack.

like image 42
mopsled Avatar answered Oct 04 '22 01:10

mopsled