¿Es posible verificar dentro de la clase ViewController que se presenta como controlador de vista modal?
iphone
ios
view
controller
modal-dialog
tibio
fuente
fuente
nil == nil
devuelveYES
, y no es el resultado que queremos.Si está buscando iOS 6+, esta respuesta está obsoleta y debe verificar la respuesta de Gabriele Petronella
No hay una forma sencilla de hacerlo, como propiedad o método nativo de UIKit. Lo que puede hacer es verificar varios aspectos de su controlador para asegurarse de que se presente como modal.
Entonces, para verificar si el controlador actual (representado como
self
en el código a continuación) se presenta de una manera modal o no, tengo la función a continuación en unaUIViewController
categoría o (si su proyecto no necesita usar otros controladores UIKit, comoUITableViewController
por ejemplo) en un controlador base que heredan mis otros controladoresEDITAR: agregué la última verificación para ver si se está utilizando un UITabBarController, y presenta otro UITabBarController como modal.
EDIT 2: se agregó la verificación de iOS 5+, donde
UIViewController
ya no respondeparentViewController
, sino apresentingViewController
.EDITAR 3: He creado una esencia para ello por si acaso https://gist.github.com/3174081
fuente
modalViewController
propiedad está obsoleta a partir de iOS 6. La documentación sugiere utilizarlapresentedViewController
en su lugar.NSLog(@"%@", self.navigationController.parentViewController)
impresiones(null)
- ¿podría explicar por qué? My ViewController está conectado con el controlador de vista modal a través de navController en el guión gráfico..parentViewController
está en desuso,.presentingViewController
debe usarse en su lugar.En iOS5 +, como puede ver en UIViewController Class Reference , puede obtenerlo de la propiedad "presentationViewController".
presentViewController El controlador de vista que presentó este controlador de vista. (solo lectura)
@property (no atómico, solo lectura) UIViewController * PresentandoViewController
Discusión
Si el controlador de vista que recibió este mensaje es presentado por otro controlador de vista, esta propiedad contiene el controlador de vista que lo presenta. Si no se presenta el controlador de vista, pero se presenta uno de sus antepasados, esta propiedad contiene el controlador de vista que presenta el antepasado más cercano. Si no se presentan ni el controlador de vista ni ninguno de sus antepasados, esta propiedad es nula.
Disponibilidad
Disponible en iOS 5.0 y posterior.
Declarado en
UIViewController.h
fuente
presentingViewController
. También funcionará en controladores de vista de contenedor, ya que atraviesa automáticamente los antepasados.Si no lo hay, puede definir una propiedad para esto (
presentedAsModal
) en su subclase UIViewController y establecerla enYES
antes de presentar ViewController como una vista modal.Puede comprobar este valor en su
viewWillAppear
anulación.Creo que no hay una propiedad oficial que indique cómo se presenta la vista, pero nada le impide crear la suya propia.
fuente
UINavigationController
como modal ... a menos que cree un controlador de navegación personalizado solo para agregar esta propiedad. Y después de eso, dentro de los controladores, tendrás que seguir transmitiendoself.navigationController
a esta clase personalizada cada vez que necesites verificar si el controlador se presenta como modalLa respuesta de Petronella no funciona si self.navigationController se presenta de forma modal pero self no es igual a self.navigationController.viewControllers [0], en ese caso se empuja self.
Así es como puede solucionar el problema.
Y en Swift:
fuente
Esto debería funcionar.
fuente
UINavigationController
yUITabBarController
casos. Está funcionando bastante bien hasta ahoraLa mejor forma de comprobar
fuente
Si no necesita distinguir entre vistas modales de pantalla completa y vistas no modales, que es el caso en mi proyecto (estaba lidiando con un problema que solo ocurre con hojas de formulario y hojas de página), puede usar modalPresentationStyle propiedad de UIViewController:
fuente
En Swift :
fuente
En mi proyecto tengo un controlador de vista (Detalle) que se puede presentar de forma modal (al agregar un nuevo elemento) o con push (al editar uno existente) mediante el controlador de vista maestro. Cuando el usuario toca [Listo], el controlador de vista de detalles llama al método del controlador de vista maestro para notificar que está listo para cerrarse. El maestro tiene que determinar cómo se presenta Detail para saber cómo cerrarlo. Así es como hago esto:
fuente
Un truco como este podría funcionar.
Sin embargo, creo que mi respuesta anterior es una solución más limpia.
fuente
Lo que funcionó para mí es lo siguiente:
Por lo que lo probé, esto funciona para iOS7 e iOS8. Sin embargo, no probé en iOS6.
fuente
Miré un poco a mi alrededor para encontrar la respuesta correcta a esta pregunta y no pude encontrar ninguna que cubriera todos los escenarios posibles. Escribí estas pocas líneas de código que parecen hacer el trabajo. Puede encontrar algunos comentarios en línea para averiguar qué se ha verificado.
Espero que esto ayude.
fuente
Aquí está mi versión modificada de @ GabrielePetronella
isModal
, que funciona con controladores de vista contenidos, ya que primero sube por la jerarquía parentViewController. También extrajo el código en varias líneas para que quede claro lo que está haciendo.fuente