¿Cómo puedo, en mi código de controlador de vista, diferenciar entre:
- presentado modalmente
- empujado en la pila de navegación
Ambos presentingViewControllery isMovingToParentViewControllerson YESen 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 HtmlViewControlleren uno UINavigationControllerque 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

presentingViewControllersiempre estáYESen mi caso; no ayuda.presentingViewControllervuelveYESpara VC empujado, cuando hay unUITabBarControllerser 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 {}falseparámetro en lareturndeclaración?Usted pasa por alto un método:
isBeingPresented.isBeingPresentedes verdadero cuando se presenta el controlador de vista y falso cuando se lo empuja.fuente
isBeingPresentedesNO. Pero ahora veo la razón, estoy incrustando mi controlador de vista presentado en unUINavigationController, y ese es el que estoy presionando.p, nopoal imprimir un valor primitivo.poes para imprimir objetos.isBeingPresented: este método devuelve SÍ solo cuando se llama desde dentro de viewWillAppear: y viewDidAppear: métodos.isBeingPresented,isBeingDismissed,isMovingFromParentViewControlleryisMovingToParentViewControllerson válidas sólo dentro de los 4view[Will|Did][Disa|A]ppearmétodos.Swift 5
Aquí hay una solución que aborda el problema mencionado con las respuestas anteriores, cuando se
isModal()devuelvetruesi se presionaUIViewControllerestá en unaUINavigationControllerpila presentada .Funciona para mí hasta ahora. Si hay algunas optimizaciones, por favor comparta.
fuente
tabBarController?.presentingViewController is UITabBarController? ¿Importa si esopresentingViewControllertambién es un UITabBarController?isModalvolverá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.hexpediente: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
DEViewControllerpodrí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 != nilsignificarí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
Aestá presentando / empujandoBDefinir un
enumypropertyenBAhora en el
Acontrolador de vista, digaBsi se está presentando / empujando asignandopresentationStyleUso en el
Bcontrolador de vistafuente
Esto le permitirá saber si viewController se presenta o se empuja
fuente