116 votes

Est-il possible de déterminer si ViewController est présenté comme modal?

Est-il possible de vérifier dans la classe ViewController qu'il est présenté en tant que contrôleur de vue modal?

96voto

Gabriele Petronella Points 32362

Puisque modalViewController est obsolète dans iOS 6, voici une version qui fonctionne pour iOS 5, iOS 6 et iOS 7 et qui compile sans avertissements.

 - (BOOL)isModal {
    return self.presentingViewController.presentedViewController == self
            || self.navigationController.presentingViewController.presentedViewController == self.navigationController
            || [self.tabBarController.presentingViewController isKindOfClass:[UITabBarController class]];
}
 

Astuce Hat à la réponse de Felipe.

77voto

Felipe Sabino Points 7853

Si vous cherchez d'iOS 6+, cette réponse est obsolète et vous devriez vérifier Gabriele Petronella de réponse


Il n'y a pas de manière simple pour le faire, comme une propriété ou une méthode native de UIKit. Ce que vous pouvez faire est de vérifier plusieurs aspects de votre contrôleur pour s'assurer qu'il est présenté comme le modal.

Donc, pour vérifier si le courant ( self dans le code ci-dessous) contrôleur est présenté de manière modale ou non, j'ai la fonction soufflet soit en UIViewController catégorie, ou (si votre projet n'a pas besoin d'utiliser d'autres UIKit contrôleurs, UITableViewController par exemple) dans un contrôleur de base que mes autres contrôleurs hériter de

-(BOOL)isModal {

     BOOL isModal = ((self.parentViewController && self.parentViewController.modalViewController == self) || 
            //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
            ( self.navigationController && self.navigationController.parentViewController && self.navigationController.parentViewController.modalViewController == self.navigationController) || 
            //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
            [[[self tabBarController] parentViewController] isKindOfClass:[UITabBarController class]]);

    //iOS 5+
    if (!isModal && [self respondsToSelector:@selector(presentingViewController)]) {

        isModal = ((self.presentingViewController && self.presentingViewController.modalViewController == self) || 
             //or if I have a navigation controller, check if its parent modal view controller is self navigation controller
             (self.navigationController && self.navigationController.presentingViewController && self.navigationController.presentingViewController.modalViewController == self.navigationController) || 
             //or if the parent of my UITabBarController is also a UITabBarController class, then there is no way to do that, except by using a modal presentation
             [[[self tabBarController] presentingViewController] isKindOfClass:[UITabBarController class]]);

    }

    return isModal;        

}

EDIT: J'ai ajouté la dernière vérification pour voir si un UITabBarController est utilisé, et vous présenter une autre UITabBarController comme modale.

EDIT 2: ajout de l'iOS 5+ check, où UIViewController n'a pas de réponse pour l' parentViewController plus, mais à l' presentingViewController à la place.

EDIT 3: j'ai créé un résumé pour juste au cas où https://gist.github.com/3174081

35voto

Raj Points 584

Dans iOS5+, Comme vous pouvez le voir dans UIViewController de Référence de Classe, vous pouvez l'obtenir à partir de la propriété "presentingViewController".

presentingViewController Le point de vue du contrôleur qui a présenté ce point de vue-contrôleur. (lecture seule)

@property(nonatomic, readonly) UIViewController *presentingViewController
Discussion

Si le point de vue du contrôleur qui a reçu ce message est présenté par un autre point de vue contrôleur, cette propriété détient la-vue-contrôleur qui est de le présenter. Si le point de vue du contrôleur n'est pas présenté, mais l'un de ses ancêtres est présenté, cette propriété contient le point de vue du contrôleur de la présentation de l'ancêtre le plus proche. Si ni le point de vue du contrôleur, ni aucun de ses ancêtres sont présentés, cette propriété détient néant.

Disponibilité
Disponible en iOS 5.0 et versions ultérieures.
Déclaré Dans
UIViewController.h

17voto

hpique Points 23090

Si ce n'est pas le cas, vous pouvez définir une propriété pour ceci ( presentedAsModal ) dans votre sous-classe UIViewController et la définir sur YES avant de présenter ViewController en tant que vue modale.

 childVC.presentedAsModal = YES;
[parentVC presentModalViewController:childVC animated:YES];
 

Vous pouvez vérifier cette valeur dans votre substitution viewWillAppear .

Je crois qu’il n’existe pas de propriété officielle indiquant comment la vue est présentée, mais rien ne vous empêche de créer la vôtre.

6voto

kubi Points 20607

Cela devrait fonctionner.

 if(self.parentViewController.modalViewController == self)…
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X