Présenter et rejeter contrôleur de vue modal
-
20-09-2019 - |
Question
Quelqu'un peut-il me donner le code exemple que je peux utiliser pour présenter un premier contrôleur de vue modal, puis le rejeter? Voilà ce que j'ai essayé:
NSLog(@"%@", blue.modalViewController); [blue presentModalViewController:red animated:YES]; NSLog(@"%@", blue.modalViewController); [blue dismissModalViewControllerAnimated:YES]; NSLog(@"%@", blue.modalViewController);Ce code est en viewDidLoad ( « bleu » et « rouge » sont les deux sous-classes de UIViewController). Je pense que je vais montrer la vue rouge puis cacher immédiatement, avec une animation. Cependant ce morceau de code ne présente que le point de vue modal et ne rejette pas. Une idée? Le premier journal affiche « null » tandis que les deux autres journaux montrent
Un autre point est, si je mets ce code dans applicationDidFinishLaunching: la vue rouge ne semble pas du tout, et tous les journaux obtenir « null »
La solution
Tout d'abord, quand vous mettez ce code dans applicationDidFinishLaunching, il pourrait être le cas que les contrôleurs instanciés de Interface Builder ne sont pas encore liés à votre application (donc « rouge » et « bleu » sont encore nil
).
Mais pour répondre à votre question initiale, ce que vous faites mal que vous appelez dismissModalViewControllerAnimated:
sur le mauvais contrôleur! Il devrait être comme ceci:
[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];
En général, le contrôleur « rouge » doit décider de se rejeter à un moment donné (peut-être quand un bouton « annuler » est cliqué). Ensuite, le contrôleur « rouge » pourrait appeler la méthode sur self
:
[self dismissModalViewControllerAnimated:YES];
Si cela ne fonctionne toujours pas, il pourrait avoir quelque chose à voir avec le fait que le contrôleur est présenté d'une manière d'animation, de sorte que vous pourriez ne pas être autorisé à rejeter le contrôleur si peu de temps après sa présentation.
Autres conseils
La meilleure façon que je fatigué Xcode 4,52 était de créer une vue supplémentaire et de les connecter à l'aide modale Segue (contrôle faites glisser le bouton de la vue une à la deuxième vue, a choisi Modal). Ensuite, faites glisser dans un bouton à la seconde vue ou la vue modale que vous avez créé. Commande et faites glisser ce bouton dans le fichier d'en-tête et d'utiliser la connexion d'action. Cela va créer un IBAction dans votre fichier Controller.m. Trouvez votre type d'action bouton dans le code.
[self dismissViewControllerAnimated:YES completion:nil];
Swift
Mise à jour pour Swift 3
Storyboard
Créer deux contrôleurs de vue avec un bouton sur chaque. Pour le deuxième contrôleur de vue, définissez le nom de classe à SecondViewController
et l'ID story-board à secondVC
.
code
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBAction func presentButtonTapped(_ sender: UIButton) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
self.present(myModalViewController, animated: true, completion: nil)
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
@IBAction func dismissButtonTapped(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
}
Source:
presentModalViewController:
MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];
dismissModalViewController:
[self dismissModalViewControllerAnimated:YES];
Swift
self.dismissViewControllerAnimated(true, completion: nil)
La meilleure façon de le faire est d'utiliser Storyboard et Segue.
Il suffit de créer un Segue du FirstViewController (pas le contrôleur de navigation) de votre TabBarController à un LoginViewController avec l'interface utilisateur de connexion et nommez-le « showLogin ».
Créer une méthode qui renvoie un BOOL pour valider si l'utilisateur connecté et / ou son / sa séance est valable ... de préférence sur le AppDelegate. Appelez-le isSessionValid.
Sur votre FirstViewController.m remplacer la méthode viewDidAppear comme suit:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if([self isSessionValid]==NO){
[self performSegueWithIdentifier:@"showLogin" sender:self];
}
}
Ensuite, si l'utilisateur connecté avec succès, tout rejeter ou pop-le LoginViewController pour afficher vos onglets.
fonctionne à 100%!
it helps!