79 votes

Présenter et rejeter le contrôleur de vue modal

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

NSLog(@"%@", blue.modalViewController);
[blue presentModalViewController:red animated:YES];
NSLog(@"%@", blue.modalViewController);
[blue dismissModalViewControllerAnimated:YES];
NSLog(@"%@", blue.modalViewController);

Ce code se trouve dans viewDidLoad ("blue" et "red" sont tous deux des sous-classes de UIViewController). Je m'attends à afficher la vue rouge puis à la masquer immédiatement, avec une certaine animation. Cependant, ce morceau de code ne fait que présenter la vue modale et ne la fait pas disparaître. Avez-vous une idée ? Le premier journal indique "null" alors que les deux autres journaux indiquent <RedViewController: 0x3d21bf0>

Un autre point est que si je mets ce code dans applicationDidFinishLaunching : la vue rouge n'apparaît pas du tout, et tous les journaux obtiennent "null".

0 votes

Comme le dit quelqu'un ci-dessous, presentModalViewController:animated: est déprécié. Vous devez maintenant utiliser presentModalViewController:animated:completion: et exécutez les opérations suivantes dans le bloc d'achèvement (si vous voulez attendre jusqu'à ce que l'opération soit terminée). red est présenté). Quoi qu'il en soit, lisez l'article que @MatterGoal suggère : developer.apple.com/library/ios/#featuredarticles/ .

110voto

Tom van Zummeren Points 3322

Tout d'abord, lorsque vous mettez 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 "red" et "blue" sont encore nil ).

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

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

Normalement, le contrôleur "rouge" devrait décider de se retirer à un moment donné (peut-être lorsqu'un bouton "cancel" 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 être dû au fait que le contrôleur est présenté sous forme d'animation, et que vous n'êtes pas autorisé à le rejeter si tôt après l'avoir présenté.

58 votes

D'après le guide de programmation des contrôleurs de vue pour iPhone OS, c'est incorrect ; lorsqu'il s'agit de rejeter les contrôleurs de vue modaux, vous devez utiliser la délégation. Ainsi, avant de présenter votre vue modale, faites-vous le délégué, puis appelez le délégué depuis le contrôleur de vue modale pour le renvoyer.

1 votes

Rappelez-vous que depuis io6, cette façon de présenter la vue modale est dépréciée. Utilisez : [self presentViewController : animated : completion :]; à la place.

5 votes

@OscarGomez Non, le Guide de programmation du contrôleur de vue n'est pas disent que cette approche est incorrecte. Il est dit que l'approche que vous suggérez est "l'approche préférée". En d'autres termes, bien que votre approche puisse fonctionner dans de nombreuses situations, elle n'est pas, par définition, la seule approche, mais simplement celle que vous devriez essayer en premier. Je vous suggère d'ajouter l'approche que vous citez comme réponse supplémentaire, car il existe plusieurs réponses viables à une question comme celle-ci et la vôtre peut être meilleure pour certains lecteurs.

21voto

Suragch Points 197

Swift

Mise à jour pour Swift 3

enter image description here

Storyboard

Créez deux contrôleurs de vue avec un bouton sur chacun. Pour le deuxième contrôleur de vue, définissez le nom de la classe comme suit SecondViewController et l'ID du storyboard à 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 :

13voto

max Points 101

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

[self dismissViewControllerAnimated:YES completion:nil];

0 votes

Notez que cela transfère automatiquement le message à self.presentingViewController (selon la documentation de UIViewController). Pour plus de clarté, il est donc préférable d'appeler [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

9voto

Jerry Thomsan Points 684

PresentModalViewController :

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

dismissModalViewController :

[self dismissModalViewControllerAnimated:YES];

3voto

RacZo Points 5731

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

Créez simplement un segment à partir du FirstViewController (pas le contrôleur de navigation) de votre TabBarController vers un LoginViewController avec l'interface utilisateur de connexion et nommez-le "showLogin".

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

Dans 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 d'écarter ou de faire apparaître le contrôleur LoginViewController pour afficher vos onglets.

Fonctionne à 100% !

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X