2011-03-17 632 views
49

¿Hay alguna manera de verificar si una vista modal está presente? Me gustaría ejecutar un método solo si hay una vista modal presente. Además, si tengo múltiples vistas modales, ¿hay alguna forma de verificar si una determinada vista modal está presente?iOS - Cómo verificar si una vista modal está presente

uso el siguiente código para presentar y despedir vistas modales:

[self presentModalViewController:myModalView animated:YES]; 
    [self dismissModalViewControllerAnimated:YES]; 

gracias de antemano!

Saludos, Evan

PS. Mi vista modal tiene un controlador de vista, pero me gustaría comprobar si la vista modal está presente en una clase separada que se ejecuta de forma asíncrona.

+7

favor considere cambiar la respuesta correcta para esta pregunta. – Daniel

Respuesta

71

¿Está comprobando la presencia de un controlador de vista modal desde el controlador de vista principal? Si es así, usted puede simplemente comprobar modalViewController la propiedad de esa controlador de vista:

BOOL modalPresent = (self.modalViewController); 

Si desea comprobar si hay un controlador de vista modal en particular, puede obtener el nombre de la clase del controlador de vista modal de la siguiente manera:

NSString *modalClassName = NSStringFromClass([self.modalViewController class]); 
+54

self.modalViewController ahora está en desuso, ahora debería usar BOOL modalPresent = (BOOL) (self.presentedViewController); – allaire

+2

Para aprovechar el comentario de @ allaire, aquí está la documentación sobre presentedViewController (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/presentedViewController) que parece sugerir que un controlador de vista modal existe solo si está siendo presentado por "esta" vista. – Danny

53

puede comprobar usando: self.presentedViewController, que devuelve The view controller that is presented by this view controller, or one of its ancestors in the view controller hierarchy.

+4

esta debería ser la respuesta marcada. 'modalViewController' está en desuso – nburk

+1

Use' presentedViewController' ahora. – WMios

5

Lo que funcionó para mí es el siguiente:

// this is the trick: set parent view controller as application's window root view controller 
UIApplication.sharedApplication.delegate.window.rootViewController = viewController; 

// assert no modal view is presented 
XCTAssertNil(viewController.presentedViewController); 

// simulate button tap which shows modal view controller 
[viewController.deleteButton sendActionsForControlEvents:UIControlEventTouchUpInside]; 

// assert that modal view controller is presented 
XCTAssertEqualObjects(viewController.presentedViewController.class, MyModalViewController.class); 

Por lo que lo he probado, esto funciona para iOS7 e iOS8. No probé en iOS6 sin embargo.

+0

No olvide agregar el UINavigationController como el controlador raíz de la ventana si su UIViewController está incrustado en uno. Luego solo llame a presentViewController en ese navController. :) –

0

se puede comprobar la presencia de un referente view controller del padre view controller

if ([[self presentingViewController] presentingViewController]) { 

} 
Cuestiones relacionadas