views:

42

answers:

1

Hi,

I am sketching out the workflow of an app where you have a main menu 'Level 0' that calls a modal view 'Level 1', which calls another modal view 'Level 2'.

I am able to get this working, no problem AND I am able to dismiss the entire stack by using:

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];

in the modal view 'Level 2'.

My problem is when modal view 'Level 2' has a navigation bar I cannot dismiss the entire stack. The code I listed above only brings me back one level so it really acts the same as if I had done this:

[self dismissModalViewControllerAnimated:YES];

on modal view 'Level 2'.

Summary: When modal view 'Level 1' calls modal view 'Level 2' using the following:

Level2 *level2 = [[[Level2 alloc] initWithNibName:@"Level2" bundle:nil] autorelease];  
[self presentModalViewController:portalMainController animated:YES];

I can dismiss the entire stack and get back to the main menu (Level 0). BUT when 'Level 1' calls 'Level 2' with a navigation bar like the following:

 Level2 *level2 = [[[Level2 alloc] initWithNibName:@"Level2" bundle:nil] autorelease];  
 UINavigationController *navigationController = [[UINavigationController alloc]    initWithRootViewController:level2];
 [self presentModalViewController:navigationController  animated:YES];
 [navigationController release];

I cannot get back to 'Level 0', I only get back to 'Level 1'.

Any suggestions?

+1  A: 

I would create a protocol for the level 2 controller such as Level2Delegate. Then set the delegate of the level 2 controller to be the level 1 controller. Then you could do something like the following:

Level 2 controller would implement this where self.delegate is the level 1 controller

[self.delegate controllerDidFinish:self];

Level 1 would implement:

- (void)controllerDidFinish:(Level2Controller *)controller {
    [[self parentViewController] dismissModalViewControllerAnimated:NO];
}

The key is to set up a chain of events rather than trying to dismiss both at once.

rickharrison
Thanks. I have setup a Level2 protocol but I am having a problem "setting the delegate of level 2 controller to be the level 1 controller". I've read a few other posts but I'm having an issue wrapping my head around that.
Vivas
When Level 1 instantiates the level 2 controller, you can do level2.delegate = self;
rickharrison
Great. Thanks Rick, I got it.
Vivas