2011-03-29 10 views
6

Tengo una situación en la que quiero abrir un controlador modal desde el otro. Pero cuando el usuario cierra cualquiera, debe regresar al controlador principal de ambos controladores modales.Cierre un ViewController modal y abra otro en el mismo método. ¿Posible?

Así que tengo el controlador principal a cargo de esto. El método en el padre hace algo similar al código siguiente cuando el usuario hace clic en un botón en el primer controlador modal.

[self.navigationController dismissModalViewController:YES]; 
SecondModalViewController *c = [[SecondModalViewController alloc] init]; 
[self.navigationController presentModalViewController:c animated:YES]; 
[c release]; 

Lo único que ocurre es que la primera vista se cierra, pero no veo la segunda vista abierta. ¿Es posible cerrar un ViewController modal y abrir un segundo ViewController en el mismo método? ¿Si es así, cómo?

Respuesta

2

Hago lo mismo todo el tiempo sin ningún problema, aunque el mío tiene animated:NO ... supongo que su problema se debe a que tiene animated:YES en ambos. ¿Qué efecto estás buscando exactamente? ¿Quieres ver uno animarse y luego animarse al otro? Si es así, debe ejecutar presentModalViewController con un retraso.

De lo contrario, solo debe poder presentar el segundo controlador de vista modal sin cerrar el primero. Cuando llamas a dismissModalViewController; debería descartar ambos.

+0

I conocer el culpable: se desestima el primero con animada: SÍ fue la prevención de la segunda de apertura. Intenté simplemente abrir el segundo y no cerrar el primero, pero eso no funcionó para mí; eso podría ser específico de mi situación sin embargo. – ageektrapped

7

Creo que para cuando cierras el primer controlador de vista, el [self.navigation presentmodal ..] no tiene auto para abrir el nuevo.

se puede hacer eso:

utilizar una variable booleana que señalar si el próxima vez que aparece este controlador (cuando se cierra el que actualmente está tratando de abrir), se debe cerrar, e implementos que característica en el viewDidApper: método, así:

@interface FirstViewController : UIViewController 
{ 
    //... 
    BOOL close; 
} 

y en el archivo .m,

-(void)viewDidAppear:(BOOL)animated{ 
    if(close) 
     [self dismissModalViewControllerAnimated:NO]; 
    else 
     [super viewDidAppear:animated]; 
} 

ahora, a O escriba su nuevo controlador, haga eso:

-(IBAction)openSecondController:(id)sender{ 
    //.. 
    SecondViewController* controller = [[SecondViewController alloc]  initWithNibName:@"SecondViewController" bundle:nil]; 
    close = YES; 
    [self presentModalViewController:controller animated:NO]; 
} 

ahora, cuando cierre el segundo, el primero también se cerrará. no tiene ningún efecto secundario visible en mis aplicaciones ...

no es la manera más limpia, pero no encontré una mejor. vítores

+0

Awesome policy! – Mehdi

0

Estoy buscando exactamente la misma respuesta. Parece un comportamiento estándar.

La forma llegué a su alrededor es utilizar performSelector: withObject: afterDelay:

[self performSelector:@selector(presentController:) withObject:navController afterDelay:0.5f]; 

El único inconveniente fue que tuve que establecer una función presentController que luego se hizo el presentModalViewController: animada:

I intenté usar una Invocación NS pero seguí obteniendo un error de acceso incorrecto cuando traté de pasar un BOOL para el argumento animado.

Lo principal es que funciona y mi cliente está contento.

Cuestiones relacionadas