Est-il possible de vérifier à l'intérieur de la classe ViewController qu'il est présenté comme un contrôleur de vue modale?
iphone
ios
view
controller
modal-dialog
tiède
la source
la source
nil == nil
retourneYES
, et ce n'est pas le résultat que l'on veut.Si vous recherchez iOS 6+, cette réponse est obsolète et vous devriez vérifier la réponse de Gabriele Petronella
Il n'y a pas de moyen efficace de le faire, en tant que propriété ou méthode native d'UIKit. Ce que vous pouvez faire est de vérifier plusieurs aspects de votre contrôleur pour vous assurer qu'il est présenté comme modal.
Donc, pour vérifier si le contrôleur actuel (représenté comme
self
dans le code ci-dessous) est présenté de manière modale ou non, j'ai la fonction ci-dessous soit dans uneUIViewController
catégorie, soit (si votre projet n'a pas besoin d'utiliser d'autres contrôleurs UIKit, commeUITableViewController
par exemple) dans un contrôleur de base dont mes autres contrôleurs héritentEDIT: J'ai ajouté la dernière vérification pour voir si un UITabBarController est utilisé, et vous présentez un autre UITabBarController comme modal.
EDIT 2: ajout de la vérification iOS 5+, où
UIViewController
ne répondparentViewController
plus, mais à lapresentingViewController
place.EDIT 3: J'ai créé un résumé pour cela au cas où https://gist.github.com/3174081
la source
modalViewController
propriété est obsolète à partir d'iOS 6. La documentation suggère de l'utiliser à lapresentedViewController
place.NSLog(@"%@", self.navigationController.parentViewController)
estampes(null)
- pourriez-vous expliquer pourquoi? Mon ViewController est connecté au contrôleur de vue modale via navController dans le storyboard..parentViewController
est obsolète,.presentingViewController
doit être utilisé à la place.Dans iOS5 +, comme vous pouvez le voir dans UIViewController Class Reference , vous pouvez l'obtenir à partir de la propriété "presentationViewController".
presentantViewController Le contrôleur de vue qui a présenté ce contrôleur de vue. (lecture seulement)
@property (non atomique, en lecture seule) UIViewController * présentant ViewController
Discussion
Si le contrôleur de vue qui a reçu ce message est présenté par un autre contrôleur de vue, cette propriété contient le contrôleur de vue qui le présente. Si le contrôleur de vue n'est pas présenté, mais que l'un de ses ancêtres est présenté, cette propriété contient le contrôleur de vue présentant l'ancêtre le plus proche. Si ni le contrôleur de vue ni aucun de ses ancêtres ne sont présentés, cette propriété est nulle.
Disponibilité
Disponible dans iOS 5.0 et versions ultérieures.
Déclaré dans
UIViewController.h
la source
presentingViewController
. Il fonctionnera également dans les contrôleurs de vue de conteneur, car il traverse automatiquement les ancêtres.Si ce n'est pas le cas, vous pouvez définir une propriété pour this (
presentedAsModal
) dans votre sous-classe UIViewController et la définir surYES
avant de présenter ViewController en tant que vue modale.Vous pouvez vérifier cette valeur dans votre
viewWillAppear
remplacement.Je crois qu'il n'y a pas de propriété officielle qui indique comment la vue est présentée, mais rien ne vous empêche de créer la vôtre.
la source
UINavigationController
comme modal ... sauf si vous créez un contrôleur de navigation personnalisé juste pour ajouter cette propriété. Et après cela, à l'intérieur des contrôleurs, vous devrez continuer à lancerself.navigationController
dans cette classe personnalisée à chaque fois que vous devez vérifier si le contrôleur est présenté comme modalLa réponse de Petronella ne fonctionne pas si self.navigationController est présenté modalement mais que self n'est pas égal à self.navigationController.viewControllers [0], dans ce cas self est poussé.
Voici comment vous pouvez résoudre le problème.
Et dans Swift:
la source
Cela devrait fonctionner.
la source
UINavigationController
et lesUITabBarController
cas. Cela fonctionne plutôt bien jusqu'à présentMeilleur moyen de vérifier
la source
Si vous n'avez pas besoin de faire la distinction entre les vues modales plein écran et les vues non modales, ce qui est le cas dans mon projet (je traitais d'un problème qui ne se produit qu'avec les feuilles de formulaire et les feuilles de page), vous pouvez utiliser le modalPresentationStyle propriété de UIViewController:
la source
Dans Swift :
la source
Dans mon projet, j'ai un contrôleur de vue (détail) qui peut être présenté de manière modale (lors de l'ajout d'un nouvel élément) ou avec push (lors de l'édition d'un élément existant) par le contrôleur de vue maître. Lorsque l'utilisateur appuie sur [Terminé], le contrôleur de vue détaillée appelle la méthode du contrôleur de vue principale pour notifier qu'il est prêt à être fermé. Le maître doit déterminer comment le détail est présenté afin de savoir comment le fermer. Voici comment je fais ceci:
la source
Un hack comme celui-ci pourrait fonctionner.
Cependant, je pense que ma réponse précédente est une solution plus propre.
la source
Ce qui a fonctionné pour moi est le suivant:
Pour autant que je l'ai testé, cela fonctionne pour iOS7 et iOS8. Je n'ai pas essayé sur iOS6 cependant.
la source
J'ai regardé un peu partout pour trouver la bonne réponse à cette question, et je n'en ai trouvé aucune couvrant tous les scénarios possibles. J'ai écrit ces quelques lignes de code qui semblent faire le travail. Vous pouvez trouver quelques commentaires en ligne pour savoir ce qui a été vérifié.
J'espère que cette aide.
la source
Voici ma version modifiée de @ GabrielePetronella
isModal
, qui fonctionne avec les contrôleurs de vue contenus en ce sens qu'elle remonte d'abord la hiérarchie parentViewController. Également extrait le code en plusieurs lignes afin que ce soit clair ce qu'il fait.la source