2010-03-19 28 views
14

Tengo problemas para mostrar mis controladores de vista modales correctamente. I tiene un controlador de vista padre que es el delegado para la vista modal A. En la vista modal, AI presenta la vista modal B y tiene la vista modal delegada de dimiss A.Problema descartando múltiples controladores de vista modal

Cuando aparece la vista modal B parece que aparece pero la pantalla se atenúa y la interfaz de usuario se bloquea, pero la aplicación no falla . Establecí la configuración de animación en NO y sigo teniendo el mismo problema.

orden de los eventos:

  1. Parent Ver espectáculo Modal View A
  2. Modal Ver A muestra Modal View B en Modal Ver Un controlador
  3. Parent Ver desestima Modal Ver A en Modal Ver Un controlador a través delegación
  4. Aquí es donde mis cuelga de interfaz de usuario, que pueden ver modal ver B, pero no pueden hacer clic en él, o hacer cualquier cosa

Respuesta

4

Resuelto por tener mi parentViewController actuar como el delegado. Aquí está mi pedido:

[parentView presentViewController:modalViewControllerA animated:YES] 
[parentView dismissModalViewControllerAnimated:YES] 
[parentView presentViewController:modalViewControllerB animated:YES] 
//Modal B dismisses himself 

En mi método delegado, que necesitaba para asegurarse de que lo descarté modal A antes de la presentación de modal B

+0

Muchas gracias. Realmente me ayudó mucho ... – Hemang

4

Un controlador de vista modal debe tener un controlador de vista principal para mostrarse. Si descarta el controlador de vista principal ("vista modal A", en su caso), el comportamiento será impredecible.

Si está seguro de que los controladores de vista modal anidados son lo que realmente desea, deberá cerrarlos en orden inverso; espere hasta que haya terminado con "B", luego descarte "B", luego descarte "A".

Si no necesita el estilo de presentación modal, sería mejor utilizar un UINavigationController para mantener su pila de controladores de visualización.

Actualización: así es como reorganizaría su orden de eventos. Presentado como código para mayor claridad.

  1. [parentView presentViewController:modalViewControllerA animated:YES]
  2. [modalViewControllerA presentViewController:modalViewControllerB animated:YES]
  3. [modalViewControllerA dismissModalViewControllerAnimated:YES]
  4. [parentView dismissModalViewControllerAnimated:YES]
+0

Modifiqué mi pregunta y visualicé mi orden de eventos. Los estoy descartando en orden inverso. –

+0

¿Está descartando Modal View B antes del paso 3? Si no, ese orden todavía me parece incorrecto. – Tom

+0

No descarto Modal View B antes del paso 3. Tengo un botón de cancelar y listo en Modal View B que se cerrará solo. Esperaba poder descartar Modal View A, trabajar en Modal View B y descartarlo. –

0

puede ser después de mucho tiempo, pero .. yo estoy en el mismo problema y esto es la única publicación con alguna respuesta. No entiendo lo que quiere decir estableciendo que el delegado de parentViewController no está permitido.

lo que estoy haciendo en este momento es

[self presentModalViewController:ViewControllerA animated:YES]; 
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerA 
[self presentModalViewController:ViewControllerB animated:YES]; 
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerB 

El problema es que después de la vista viewControllerA, viewControllerB no está presentando.

Gracias,

0

que tienen una vista principal y la necesidad de mostrar una modalview1 donde un botón presenta un modalview2. Se ve lo mismo que necesitabas. Pero hay un botón en modalview2 que lo reenvía a la vista principal.

Así que la solución es: La vista principal presenta UINavigationController con modalview1 como rootController. Entonces modalview1 presenta modalview2 por "[self.navigationController modalview2 animated: YES];".

Cuando modal2 necesita reenviar a la vista principal, simplemente haga "[self.parentViewController dismissModalViewControllerAnimated: YES];" y UINavigationController está oculto.

espero que sea clara.

0

simple:

despedir a todos los puntos de vista:

[self dismissModalViewController animated:YES]; 
[self dismissModalViewController animated:YES]; 
[self dismissModalViewController animated:YES]; 
[self dismissModalViewController animated:YES]; 

(uno para cada añadieron vista modal)

continuación, presentamos un nuevo controlador de vista modal

+0

Con esta solución, ¿cómo averiguan los ModalViewControllers en el orden cuando los anteriores han sido descartados? –

20

Usted podría utilizar esta

[[[self presentingViewController] presentingViewController] dismissModalViewControllerAnimated:YES]; 
+0

esto rocas. ¡Gracias! –

+0

solución perfecta hermano, ¡¡¡Gracias !!! – Pradip

+3

¿Hay alguna manera de que el controlador de vista intermedia no se muestre al descartar? p.ej. A presenta B que presenta C. Desde C, autopresente ViewController.presentingViewController.dismissViewController(), pero B parpadea durante la transición. Prefiero simplemente que C se deslice hacia abajo y aparezca A. EDITAR: Parece un error desde iOS 8 :( – dfickling

1

Para iOS 6+ y - presentViewController:animated:completion:

[[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil]; 
1

en Swift 2.1

puede probar

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil) 

funciona para mí

Ver A -> View B -> Vista C

Aplica este código en la vista C, estarás aterrizando en la Vista A

documento
0

de Apple sobre dismiss(animated:completion:) método.

En la sección Discussion, que dijo:

any intermediate view controllers are simply removed from the stack. 

Si presenta varios controladores de vista de la sucesión, construyendo así una pila de controladores de vista presentados, llamar a este método en un controlador de vista hacia abajo en la descarta su controlador de vista hijo inmediato y todos los controladores de vista sobre ese niño en la pila. Cuando esto sucede, solo se descarta la vista más alta de forma animada; cualquier controlador de vista intermedia simplemente se elimina de la pila. La vista superior se descarta mediante su estilo de transición modal, que puede diferir de los estilos utilizados por otros controladores de vista inferiores en la pila.

En otras palabras, si la vista pila controlador como siguiente

Root -> A -> B -> C -> D ... -> Z 

D llamadas dismiss método, todos los controladores de vista behide D, ex: (E ... Z), será retirado de la pila.

Cuestiones relacionadas