ios descartar un controller y presentar un controller con animation

Tengo un controller de vista raíz que presenta un controller de vista de authentication. Una vez que el usuario se autentica, necesito descartar el controller de authentication y presentar un controller específico para el usuario (ejemplo: controller de embarque, controller de usuario normal, controller de usuario profesional). Lo que me gustaría que sucediera es cuando el controller de authentication está animado hacia abajo, se revela el controller apropiado (como si se presentara antes del controller de authentication).

Estas son las dos soluciones que he probado hasta ahora. Ambos muestran el controller de vista raíz entre las transiciones.

  1. En la vista -viewDidAppear del controller de vista raíz, presento el controller apropiado (authentication o controller específico del usuario).

  2. He intentado descartar y presentar los dos controlleres utilizando lo siguiente:

     [authenticationController dismissViewControllerAnimated:<NO|YES> completion:^{ [userController presentViewController:viewController animated:animated completion:nil]; }]; 

TLDR:

Tengo una jerarquía de vista modal que comienza como este rootViewController->viewController1 y quiero hacer una transición a rootViewController->viewController2 donde viewController1 anima hacia abajo para mostrar viewController2

Una vez que el usuario termina la authentication, establezca una bandera de valor significativo para usted y luego diga que una vez que presionan Aceptar o Enviar, puede verificar y configurar la bandera.

Desde allí instilará uno de los tres controlleres de vista y lo presionará en la stack de navigation; hágalo usando el guión gráfico si lo desea, configurando el ID del guión gráfico en un valor y luego instancie el guión gráfico con la ID del guión gráfico.

Si necesita más aclaraciones o si este no es el path correcto, avíseme.

UN

EDITAR: una vez que instimes, tendrás que presentar el controller de vista con animation

La documentation para -dismissViewControllerAnimated:completion: indica:

Si presenta varios controlleres de vista en sucesión, creando así una stack de controlleres de vista presentados, llamar a este método en un controller de vista más bajo en la stack descarta su controller de vista secundario inmediato y todos los controlleres de vista por encima de ese elemento secundario en la stack. Cuando esto sucede, solo la vista superior se descarta de manera animada; cualquier controller de vista intermedia simplemente se elimina de la stack.

Entonces, una forma de lograr ese tipo de comportamiento sería organizar a sus controlleres de vista de esta manera:

Storyboard Screenshot

vc2 controller de vista vc2 que quieres mostrar después del inicio de session en la primera position. En el método -viewWillAppear 's -viewWillAppear , reenvía a vc1 en caso de que el usuario no haya iniciado session:

 - (void)viewWillAppear { if (!userLoggedIn) { UIViewController *vc1 = [[YourViewControllerClass1 alloc] init]; [self presentViewController:vc1 animated:YES completion:nil]; } } 

Cuando el usuario toca el button Show Login VC en vc1 a vc1 , vc1 el controller de vista de inicio de session:

 - (IBAction)touchUpInsideShowLoginVCButton:(id)sender { UIViewController *loginVC = [[YourLoginViewControllerClass alloc] init]; loginVC.delegate = self.presentingViewController; [self presentViewController:loginVC animated:YES completion:nil]; } 

También configura vc2 como delegado de loginVC aquí porque necesita una reference a vc2 en su loginVC . ( loginVC definir un delegate propiedad en el file .h de loginVC 🙂

 @property (strong, nonatomic) UIViewController *delegate; 

Finalmente, cuando el usuario selecciona el button de inicio de Login y el inicio de session es exitoso, descarta dos controlleres de vista al mismo time (simplemente invocando -dismissViewControllerAnimated:completion: en vc2 que es el más bajo en la jerarquía) para revelar vc2 para el primer hora.

 - (IBAction)touchUpInsideLoginButton:(id)sender { // ... your login code if (loginSuccessful) { [self.delegate dismissViewControllerAnimated:YES completion:nil]; } } 

Creo que presentViewController no es compatible para insert un viewController debajo de la parte superior presentedViewController, que es el controller de authentication aquí. Si tiene un control de navigation para rootViewController, puede probar pushViewController:animated: antes de descartar el controller de authentication, y push animated puede ser NO;