¿Cómo puedo, en mi código de controlador de vista, diferenciar entre:
- presentado modalmente
- empujado en la pila de navegación
Ambos presentingViewController
y isMovingToParentViewController
son YES
en ambos casos, por lo que no son de mucha ayuda.
Lo que complica las cosas es que mi controlador de vista principal es a veces modal, en el que se empuja el controlador de vista que se va a verificar.
Resulta que mi problema es que inserto mi HtmlViewController
en uno UINavigationController
que luego se presenta. Es por eso que mis propios intentos y las buenas respuestas a continuación no estaban funcionando.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Supongo que será mejor que le diga a mi controlador de vista cuando sea modal, en lugar de tratar de determinarlo.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
el significado importa
fuente
fuente
presentingViewController
siempre estáYES
en mi caso; no ayuda.presentingViewController
vuelveYES
para VC empujado, cuando hay unUITabBarController
ser establecido como root. Por lo tanto, no es adecuado en mi caso.En Swift :
Agregue una bandera para probar si es modal por tipo de clase:
fuente
var isModal: Bool {}
false
parámetro en lareturn
declaración?Usted pasa por alto un método:
isBeingPresented
.isBeingPresented
es verdadero cuando se presenta el controlador de vista y falso cuando se lo empuja.fuente
isBeingPresented
esNO
. Pero ahora veo la razón, estoy incrustando mi controlador de vista presentado en unUINavigationController
, y ese es el que estoy presionando.p
, nopo
al imprimir un valor primitivo.po
es para imprimir objetos.isBeingPresented
: este método devuelve SÍ solo cuando se llama desde dentro de viewWillAppear: y viewDidAppear: métodos.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
yisMovingToParentViewController
son válidas sólo dentro de los 4view[Will|Did][Disa|A]ppear
métodos.Swift 5
Aquí hay una solución que aborda el problema mencionado con las respuestas anteriores, cuando se
isModal()
devuelvetrue
si se presionaUIViewController
está en unaUINavigationController
pila presentada .Funciona para mí hasta ahora. Si hay algunas optimizaciones, por favor comparta.
fuente
tabBarController?.presentingViewController is UITabBarController
? ¿Importa si esopresentingViewController
también es un UITabBarController?isModal
volverátrue
. ¿Es esto intencionado?Para manejar el caso de que el controlador de vista actual se presiona mientras el controlador de navegación se presenta modalmente, he agregado algunas líneas de código para verificar si el controlador de vista actual es el controlador raíz en la pila de navegación.
fuente
Swift 4
fuente
Swift 5. Limpio y simple.
fuente
Como muchas personas aquí sugieren, que los métodos de "verificación" no funcionan bien en todos los casos, en mi proyecto se me ocurrió una solución para administrarlo manualmente. El punto es que, por lo general, gestionamos la presentación por nuestra cuenta; esto no es lo que sucede detrás de escena y debemos introspectarlo.
DEViewController.h
expediente:Las presentaciones ahora se podrían gestionar de esta manera:
empujado en la pila de navegación:
presentado modalmente con navegación:
presentado modalmente:
Además, en
DEViewController
podríamos agregar una alternativa a la "verificación" si la propiedad mencionada es igual aSSViewControllerPresentationMethodUnspecified
:fuente
Suponiendo que todos los viewControllers que presentas modalmente están envueltos dentro de un nuevo navigationController (que siempre debes hacer de todos modos), puedes agregar esta propiedad a tu VC.
fuente
Para detectar que su controlador es presionado o no, simplemente use el siguiente código en el lugar que desee:
Espero que este código pueda ayudar a cualquiera ...
fuente
self.navigationController != nil
significaría que está en una pila de navegación.fuente
fuente
Si está utilizando ios 5.0 o posterior, utilice este código
fuente
Swift 5
Esta práctica extensión maneja pocos casos más que las respuestas anteriores. Estos casos son VC (controlador de vista) es el VC raíz de la ventana de la aplicación, VC se agrega como VC secundario a primario. Intenta devolver verdadero solo si el viewcontroller se presenta modalmente.
Gracias a la respuesta de Jonauz . Nuevamente hay espacio para más optimizaciones. Discuta sobre el caso que debe manejarse en la sección de comentarios.
fuente
Para alguien que se pregunta, Cómo decirle a ViewController que se está presentando
si
A
está presentando / empujandoB
Definir un
enum
yproperty
enB
Ahora en el
A
controlador de vista, digaB
si se está presentando / empujando asignandopresentationStyle
Uso en el
B
controlador de vistafuente
Esto le permitirá saber si viewController se presenta o se empuja
fuente