Est-il possible de vérifier dans la classe ViewController qu'il est présenté en tant que contrôleur de vue modal?
Réponses
Trop de publicités? 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.
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
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
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.