2011-03-17 3 views
49

Existe-t-il un moyen de vérifier si une vue modale est présente? Je voudrais exécuter une méthode uniquement si une vue modale est présente. En outre, si j'ai plusieurs vues modales, existe-t-il un moyen de vérifier si une certaine vue modale est présente.iOS - Comment vérifier si une vue modale est présente

J'utilise le code suivant pour présenter et rejeter des vues modales:

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

Merci à l'avance!

Cheers, Evan

PS. Ma vue modale a un contrôleur de vue, mais je voudrais vérifier si la vue modale est présente à partir d'une classe séparée qui s'exécute de manière asynchrone.

+7

S'il vous plaît envisager de changer la bonne réponse à cette question. – Daniel

Répondre

71

Vérifiez-vous la présence d'un contrôleur de vue modale à partir du contrôleur de vue parent? Si oui, vous pouvez simplement vérifier ce point de vue de la propriété modalViewController du contrôleur:

BOOL modalPresent = (self.modalViewController); 

Si vous voulez vérifier un contrôleur de vue modal particulier, vous pouvez obtenir le nom de la classe du contrôleur de vue modal comme ceci:

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

self.modalViewController est maintenant obsolète, vous devez maintenant utiliser BOOL modalPresent = (BOOL) (self.presentedViewController); – allaire

+2

Pour revenir sur le commentaire de @ allaire, voici la documentation sur presentController (http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/presentedViewController) qui semble indiquer qu'un contrôleur de vue modale n'existe que s'il est présenté par "cette" vue. – Danny

53

Vous pouvez vérifier à l'aide: self.presentedViewController, qui retourne The view controller that is presented by this view controller, or one of its ancestors in the view controller hierarchy.

+4

cela devrait être la réponse cochée. 'modalViewController' est obsolète – nburk

+1

Utilisez' presentViewController' maintenant. – WMios

5

Ce qui a fonctionné pour moi est le suivant:

// 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); 

Pour autant que je l'ai testé, cela fonctionne pour iOS7 et iOS8. N'a pas essayé sur iOS6 cependant.

+0

N'oubliez pas d'ajouter UINavigationController en tant que rootViewController de la fenêtre si votre UIViewController est intégré dans un. Ensuite, appelez presentedViewController sur ce navController. :) –

0

Vous pouvez vérifier la présence d'un view controller modal de la société mère view controller

if ([[self presentingViewController] presentingViewController]) { 

} 
Questions connexes