Comment puis-je, dans mon code de contrôleur de vue, faire la différence entre:
- présenté modalement
- poussé sur la pile de navigation
Les deux presentingViewController
et isMovingToParentViewController
sont YES
dans les deux cas, donc ne sont pas très utiles.
Ce qui complique les choses, c'est que mon contrôleur de vue parent est parfois modal, sur lequel le contrôleur de vue à vérifier est poussé.
Il s'avère que mon problème est que j'intègre mon HtmlViewController
dans un UINavigationController
qui est ensuite présenté. C'est pourquoi mes propres tentatives et les bonnes réponses ci-dessous n'ont pas fonctionné.
HtmlViewController* termsViewController = [[HtmlViewController alloc] initWithDictionary:dictionary];
UINavigationController* modalViewController;
modalViewController = [[UINavigationController alloc] initWithRootViewController:termsViewController];
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:modalViewController
animated:YES
completion:nil];
Je suppose que je ferais mieux de dire à mon contrôleur de vue quand il est modal, au lieu d'essayer de déterminer.
ios
objective-c
swift
uiviewcontroller
uinavigationcontroller
le sens compte
la source
la source
presentingViewController
c'est toujoursYES
dans mon cas; n'aide pas.presentingViewController
retourneYES
pour VC poussé, quand il y a unUITabBarController
être défini en tant que racine. Donc, ne convient pas dans mon cas.Dans Swift :
Ajoutez un indicateur pour tester s'il s'agit d'un modal par le type de classe:
la source
var isModal: Bool {}
false
paramètre de l'return
instruction?Vous oublié un méthode:
isBeingPresented
.isBeingPresented
est vrai lorsque le contrôleur de vue est présenté et faux lorsqu'il est poussé.la source
isBeingPresented
c'estNO
. Mais je vois la raison maintenant, j'intègre mon contrôleur de vue présenté dans unUINavigationController
, et c'est celui que je pousse.p
, paspo
lors de l'impression d'une valeur primitive.po
est pour l'impression d'objets.isBeingPresented
- Cette méthode renvoie YES uniquement lorsqu'elle est appelée depuis l'intérieur des méthodes viewWillAppear: et viewDidAppear:.isBeingPresented
,isBeingDismissed
,isMovingFromParentViewController
etisMovingToParentViewController
ne sont valables que dans les 4view[Will|Did][Disa|A]ppear
méthodes.Swift 5
Voici une solution qui résout le problème mentionné avec les réponses précédentes, lorsque les
isModal()
retourstrue
si poussésUIViewController
sont dans uneUINavigationController
pile présentée .Cela fonctionne pour moi jusqu'à présent. Si quelques optimisations, merci de partager.
la source
tabBarController?.presentingViewController is UITabBarController
? Est-ce important si c'estpresentingViewController
aussi un UITabBarController?isModal
retourneratrue
. Est-ce voulu?Afin de gérer le cas où le contrôleur de vue actuel est poussé alors que le contrôleur de navigation est présenté de manière modale, j'ai ajouté quelques lignes de code pour vérifier si le contrôleur de vue actuel est le contrôleur racine dans la pile de navigation.
la source
Swift 4
la source
Swift 5. Propre et simple.
la source
Comme beaucoup de gens ici le suggèrent, que les méthodes de «vérification» ne fonctionnent pas bien dans tous les cas, dans mon projet, j'ai trouvé une solution pour gérer cela manuellement. Le fait est que nous gérons généralement nous-mêmes la présentation - ce n'est pas ce qui se passe dans les coulisses et nous devons introspecter.
DEViewController.h
fichier:Les présentations pourraient maintenant être gérées de cette façon:
poussé sur la pile de navigation:
présenté modalement avec navigation:
présenté modalement:
En outre, dans
DEViewController
nous pourrions ajouter une solution de secours à "vérifier" si la propriété susmentionnée est égale àSSViewControllerPresentationMethodUnspecified
:la source
En supposant que tous les viewControllers que vous présentez de manière modale sont enveloppés dans un nouveau navigationController (ce que vous devriez toujours faire de toute façon), vous pouvez ajouter cette propriété à votre VC.
la source
Pour détecter que votre contrôleur est poussé ou non, utilisez simplement le code ci-dessous où vous le souhaitez:
J'espère que ce code peut aider n'importe qui ...
la source
self.navigationController != nil
signifierait que c'est dans une pile de navigation.la source
la source
Swift 5
Cette extension pratique gère quelques cas de plus que les réponses précédentes. Ces cas sont VC (contrôleur de vue) est le VC racine de la fenêtre d'application, VC est ajouté en tant qu'enfant au VC parent. Il essaie de renvoyer true uniquement si le viewcontroller est présenté de manière modale.
Merci à la réponse de Jonauz . Là encore, il y a de la place pour plus d'optimisations. Veuillez discuter du cas qui doit être traité dans la section des commentaires.
la source
Si vous utilisez iOS 5.0 ou version ultérieure, veuillez utiliser ce code
la source
Pour quelqu'un qui se demande, comment dire à ViewController qu'il est présenté
si
A
présente / pousseB
Définir un
enum
etproperty
dansB
Maintenant dans le
A
contrôleur de vue, ditesB
s'il est présenté / poussé en affectantpresentationStyle
Utilisation dans
B
View Controllerla source
Cela vous permettra de savoir si viewController est présenté ou poussé
la source