web-dev-qa-db-fra.com

Présenter et renvoyer le contrôleur de vue modale

Quelqu'un peut-il me donner l'exemple de code que je peux utiliser pour présenter d'abord un contrôleur de vue modale, puis le rejeter? C'est ce que j'ai essayé:

 NSLog (@ "% @", blue.modalViewController); 
 [Blue presentModalViewController: animation en rouge: OUI]; 
 NSLog (@ "% @", blue.modalViewController) ; 
 [blue rejetModalViewControllerAnimated: YES]; 
 NSLog (@ "% @", blue.modalViewController); 

70
phunehehe

Tout d'abord, lorsque vous insérez ce code dans applicationDidFinishLaunching, il se peut que les contrôleurs instanciés à partir d'Interface Builder ne soient pas encore liés à votre application (donc "rouge" et "bleu" sont toujours nil.).

Mais pour répondre à votre question initiale, ce que vous faites mal, c'est que vous appelez dismissModalViewControllerAnimated: sur le mauvais contrôleur! Cela devrait être comme ça:

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

Habituellement, le contrôleur "rouge" devrait décider de se renvoyer lui-même à un moment donné (peut-être lorsqu'un clic sur le 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, cela peut avoir un lien avec le fait que le contrôleur est présenté sous forme d'animation. Par conséquent, vous ne serez peut-être pas autorisé à fermer le contrôleur si tôt après l'avoir présenté.

106
Tom van Zummeren

Swift

Mis à jour pour Swift 3

enter image description here

Storyboard

Créez deux contrôleurs de vue avec un bouton sur chacun. Pour le second contrôleur de vue, définissez le nom de la classe sur SecondViewController et l'ID du storyboard sur 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)
    }
}

La source:

13
Suragch

Le moyen le plus simple de me fatiguer dans xcode 4.52 était de créer une vue supplémentaire et de les connecter en utilisant segue modal (le contrôle fait glisser le bouton de la vue 1 à la seconde, choisissez Modal). Ensuite, faites glisser un bouton vers la seconde vue ou la vue modale que vous avez créée. Contrôlez et faites glisser ce bouton dans le fichier d’en-tête et utilisez la connexion d’action. Cela créera une IBaction dans votre fichier controller.m. Trouvez votre type d'action dans le code.

[self dismissViewControllerAnimated:YES completion:nil];
13
max

presentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

licencierModalViewController:

[self dismissModalViewControllerAnimated:YES];
9
Jerry Thomsan

Swift

self.dismissViewControllerAnimated(true, completion: nil)

3
Michael

La façon la plus simple de le faire est d'utiliser Storyboard et Segue.

Il suffit de créer une séquence à partir du FirstViewController (et non du contrôleur de navigation) de votre TabBarController vers un LoginViewController avec l’UI de connexion et nommez-la "showLogin".

Créez une méthode qui retourne un BOOL pour valider si l'utilisateur connecté et/ou sa session est valide ... de préférence sur le AppDelegate. Appelez-le isSessionValid.

Sur votre FirstViewController.m, remplacez 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 s'est connecté avec succès, il suffit de fermer ou de faire apparaître le LoginViewController pour afficher vos onglets.

Fonctionne à 100%!

J'espère que ça aide!

2
Oscar S.