2010-03-10 14 views
6

En mi aplicación tengo BaseViewController (NavigationController) como controlador raíz. Normalmente uso el siguiente código para navegar:Usando pushViewController después de presentModalViewController

[self.navigationController pushViewController:childController animated:YES]; 

Pero en una de las acciones que quieren que el próximo fin de animar boton arriba, así que utilizo:

[self presentModalViewController:childController animated:YES]; 

Todo funciona hasta ahora. En la vista modal, quiero presionar otro controlador, pero parece que no funciona. He intentado lo siguiente:

// self.navigationController is null, so this doesn't work 
[self.navigationController pushViewController:childController animated:YES]; 

// self.parentViewController is the BaseViewController and not null, but this 
// won't work either. This also generates a warning "UIViewController' may not 
// respond to '-pushViewController:animated:" 
[self.parentViewController pushViewController:childController animated:YES]; 

En ambos casos no ocurre nada. ¿Está desactivado pushViewController mientras se muestra una vista modal? Si es así, ¿hay otra manera que puedo:

  1. Animar al lado del controlador de abajo hacia arriba
  2. animar el siguiente controlador de izquierda a derecha, con un botón de retroceso, como de costumbre. El botón Atrás debería llevarlo a la vista anterior (modal).

?

Respuesta

4

Si presentaModelViewController, debe cerrarlo antes de poder llamar a los métodos del controlador de navegación; de lo contrario, debe colocar este controlador de vista en la pila de navegación para colocar otro controlador de vista encima.

+0

Según su respuesta, hice una solución que funciona. En lugar de presentar directamente el modal de childcontroller, creo otra instancia de BaseViewController y la agrego de manera modal. El control pushViewController funciona como se esperaba, ya que la vista modal contiene ahora un control de navegación: ChildController * childController = [[ChildController alloc] init]; BaseTrackingViewController * baseController = [[BaseTrackingViewController alloc] initWithRootViewController: childController]; [self presentModalViewController: baseController animated: YES]; –

0

Esto podría ser útil: Core Animation - Sheet-like Window Sliding

Si se utiliza ese conjuntamente con [self.navigationController pushViewController:childController animated:NO]; para desactivar la animación nativa, se puede producir el efecto que buscas.

No olvide revertir la operación cuando se saca childController de la pila de navegación.

0

Utilizando el siguiente método, primero presente el controlador de vista de modo modal con animated: YES, luego deséchelo sin animación y luego empújelo en el controlador de vista sin animación. Tendrá que crear su propia barra de navegación para esta vista y deberá ocultar la barra de navegación del controlador de navegación.

 [self presentModalViewController:childController animated:YES]; 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
      sleep(1); 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       [self dismissModalViewControllerAnimated:NO]; 
       [self.navigationController pushViewController:childController animated:NO]; 
      }); 
     }); 

En el childController cuando botón de cancelación de clics:

if (self.navigationController != nil) { 
    if ([delegate respondsToSelector:@selector(didDissmissSearchViewController)]) { 
     [self.navigationController popViewControllerAnimated:NO]; 
     [delegate didDissmissChildViewController]; 
    } 
    else { 
     [self.navigationController popViewControllerAnimated:NO]; 
    } 
} 

y en el delegado:

- (void)didDissmissSearchViewController { [self presentModalViewController:childController animated:NO]; [self dismissModalViewControllerAnimated:YES]; }

1

Usar las siguientes líneas de código para presentar childController, entonces navigationcontroller no lo hará ser nulo, así que funcionará como lo desee.

UINavigationController * childNavigationController = [[UINavigationController alloc] initWithRootViewController:childController]; 
childNavigationController.navigationBarHidden = YES;//if u want to show navigation bar then remove this line 
[self.navigationController presentModalViewController:coinsNavigationController animated:YES]; 

Después de presentModelViewController puede presentar o presionar cualquier otro controlador de vista dentro del controlador de vista presentado.

// self.navigationController in this case will never be null. so following line will work perfectly inside presented child View controller (childController) 
[self.navigationController pushViewController:childController animated:YES]; 

Aquí es la salida deseada:

  1. childController se presentará a través de la parte inferior de animación a la parte superior sobre BaseViewController
  2. será empujado Una otra instancia de controlador niño a través de la animación izquierda a derecha sobre childController.

Espero que esta sea una solución útil y fácil.

Cuestiones relacionadas