UINavigationController: presentando el controller de visualización mientras se descarta que otro controller esté en progreso en el iPad

Tengo una vista que requiere que el usuario inicie session. Cuando el usuario intenta abrir esa vista y no está conectado, llamaré a la vista de inicio de session para que inicie session y, una vez que haya terminado, llamaré a la vista original que pretendía para ver.
En el iPhone esto funciona bien cuando presiono controlleres de vista allí. Pero en el iPad donde presento ver controller, esto no funciona. Dice que el rechazo en curso, no puede mostrar un nuevo controller. Aquí está el código:

- (void) buttonPressed { if (!userLoggedIn) { // userLoggedIn getter calls new screens of login if needed return; // this is executed if user declined to login } MyViewController *temp = [[MyViewController alloc] init]; [self.navigationController presentViewController:temp animated:YES]; // this returns warning that dismissal in progress and does not work } 

¿Qué puedo hacer al respecto? En iPhone, toda mi lógica funciona bien, pero falla en el iPad. Lo uso en muchos lugares y el código de reescritura completo no es bueno.

EDITAR: más código:

 - (BOOL) userLoggedIn { // code omitted [centerController presentViewController:navController animated:YES completion:nil]; // code omitted [centerController dismissViewController:navController animated:YES]; // setting to NO does not fix my problem return YES; } 

EDIT2: este es el código para iPad. He eliminado el código relacionado con iPhone. Lo que hace en iPhone: en lugar de presentar un controller, usa empujar, y en esa situación todo funciona bien.

No puede presentar otra vista siempre que no se haya completado el rechazo de su primera vista. La animation de vista despejada debe completarse antes de presentar una nueva vista. Por lo tanto, puede configurar su animation como NO al descartar, o usar performSelector:withObject:afterDelay: y presentar la siguiente vista después de 2-3 segundos.

Espero que esto ayude.

No ha publicado el código suficiente para ver realmente lo que está haciendo, pero una aproximación al problema de rechazar y empujar a los controlleres de vista chocando de esta manera es hacer que el pop + pijo se convierta en una sola operación de operación atómica, más bien que secuencial operaciones

Puede hacer esto utilizando el setViewControllers:animated: en UINavigationController . Esto le permite eliminar de manera efectiva uno o más controlleres de visualización y agregar uno o más controlleres de visualización, todo como una operación cohesiva, con una animation sin interrupciones.

Aquí hay un ejemplo simple:

 [self.navigationController pushViewController:loginController]; // ... later on, when user login is validated: NSMutableArray *viewControllers = [self.navigationController.viewControllers copy]; [viewControllers removeLastObject]; [viewControllers addObject:[[MyNewViewController alloc] init]]; [self.navigationController setViewControllers:viewControllers animated:YES]; 

Si haces las cosas de esta manera, tu código será más pnetworkingecible y funcionará en iPhone e iPad.

Para get más información, consulte los documentos de la API .

Actualizar

Como su problema incluye un cuadro de dialog modal en la parte superior, intente usar setViewControllers:animated:NO para cambiar la stack del controller de navigation debajo del dialog de inicio de session modal antes de descartar el modal.