Lena Bru
Lena Bru

Reputation: 13947

How to switch between view controllers and get rid of the previous one

In android, switching between activities, is fairly straightforward

you call

Intent intent = new Intent(this,NextActivity.class); <- define the next activity
startActivity(intent); <- start the next activity
finish(); < -get rid of the current activity

now in iOS i know how to do this:

UIViewController *nextviewcontroller = [[UIViewController alloc]initWithNibName:@"nextvc" bundle:nil];
[self presentViewcontroller:nextviewcontroller animated:YES completion:nil];

How do I get rid of the current view controller? so that currentviewcontroller dies after presenting nextviewcontroller ?

[self dismissViewController:YES]; doesnt seem to do the trick

the lifecycle methods viewWillDisappear and viewDidDisappear are called even if I don't call [self dismissViewController:YES];

i want "currentviewcontroller" to be removed from the memory, and from the viewcontroller stack, so that clicking "back" in "nextviewcontroller" will go to some thirdviewcontroller that was before currentviewcontroller

Upvotes: 1

Views: 286

Answers (5)

user2955351
user2955351

Reputation: 273

I have tried the method of storing all the view controllers in an array but it didn't work for me . When you try popViewController it will move to the View Controller which is last in the stack. You can make 2 navigation controllers and switch between them and also switch between the view controllers of a particular Navigation Controller. For eg. You can switch between 2 Navigation Controller using the following code:

    FirstNavController *fisrtView=[storyboard instantiateViewControllerWithIdentifier:@"firstnavcontroller"];
        self.window.rootViewController = firstView;

    }else{
        SecondNavController *secondView=[storyboard instantiateViewControllerWithIdentifier:@"loginnavcontroller"];
        self.window.rootViewController = secondView;

    }

If your FirstNavController has 2 ViewControllers then you can switch between them using pushViewController

SecondViewController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"secondviewcontroller"];
    [[self navigationController] pushViewController:sc animated:YES];

and popViewController

[self.navigationController popViewControllerAnimated:YES];

Upvotes: 0

Simon
Simon

Reputation: 25983

iOS doesn't maintain a global stack of controllers in the way that Android does. Each app shows a controller at its root, and that one is responsible for showing the other controllers in the app. Controllers can display other controllers modally using presentViewcontroller:animated:completion: but the presenting controller remains underneath the presented one.

If your current controller is the root controller, then instead of using presentViewcontroller:animated:completion: you'd just do this:

self.view.window.rootViewController = nextViewController;

It's very common for the root controller to be a UINavigationController, which does manage a stack of controllers. If that is the case, and if your current controller is at the top of the stack, you'd do this:

[self.navigationController popViewControllerAnimated:NO];
[self.navigationController pushViewController:nextViewController animated:YES];

If your setup is different, you'd do something different; it's hard to say what without knowing more. But it's most likely that you'd be in the UINavigationController case.

Upvotes: 1

iphonic
iphonic

Reputation: 12719

There is nothing available like this in iOS but you can achieve it doing something like below

NSArray *viewControllers=[self.navigationController viewControllers];

NSMutableArray *newControllers=[[NSMutableArray alloc] init];

for(int i=[viewControllers indexOfObject:self];i<viewControllers.count;i++){
        [newControllers addObject:[viewControllers objectAtIndex:i]];
}

[self.navigationController setViewControllers:[[NSArray alloc] initWithArray:newControllers]];

Upvotes: 0

Stefano Mondino
Stefano Mondino

Reputation: 1219

In iOS is different, since there's no concept of Activity and everything is more focused on the app itself (in Android you can mix activities from different apps). Therefore, there's no concept of "view controller stack". The most similar concept is the "navigation stack" of navigation controllers, where you actually push and pop new view controller into some kind of linear navigation. A navigation bar is automatically created and populated with back buttons.

presentViewController will show your view controller modally upon the current one, but you can't thrash the presenting one since it's holding and containing ("defining context") the new one.

If you use a navigation controller for your navigation hierarchy (I don't know if you can), you can override the back button and use something like

UIViewController * prev = self.navigationController.viewControllers[self.navigationController.viewControllers.count -2 ]
[self.navigationController popToViewController:prev animated:YES]

With a modal view controller, you may try something like (I haven't tried but it may work)

[self.presentingViewController.navigationController popViewControllerAnimated:YES]

You should write one of these code into the target action of your close button.

Upvotes: 1

streem
streem

Reputation: 9144

In the viewDidAppear of your nextviewcontroller you could add :

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];    
    NSArray *controllers = self.navigationController.viewControllers;
    NSMutableArray *newViewControllers = [NSMutableArray arrayWithArray:controllers];
    [newViewControllers removeObjectAtIndex:[controllers count]-2];
    self.navigationController.viewControllers = newViewControllers;
}

Upvotes: 0

Related Questions