IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Swift Discussion :

Problème : Attendre la réponse de l'utilisateur pour passer à la suite du code


Sujet :

Swift

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Problème : Attendre la réponse de l'utilisateur pour passer à la suite du code
    Bonjour bonjour,

    Après plusieurs heures de recherches infructueuses je me tourne vers vous en espérant trouver ma solution certainement tout bête ...

    Je développe une appli IOS avant tout pour me permettre d'apprendre d'avantage l'utilisation de Xcode et de Swift pour IOS
    J'explique mon problème : Lors d'un clique par l'utilisateur sur un bouton de l'UI cela lance la fonction correspondante au bouton, dans cette fonction je demande notamment :
    1 : Cacher le bouton actuel pour
    2 : le remplacer par un second bouton et
    3 : Arrêter un timer.

    Enfin (et c'est la que les problèmes arrivent !) je demande l'execution d'une autre fonction qui doit m'ouvrir une Alert et attendre la réponse de l'utilisateur avant de passer la suite du code... mais mon problème c'est que le code se déroule et effectue les actions sans attendre la réponse de l'utilisateur ...

    CF les codes de mes deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @IBAction func StopFlight(_ sender: Any) {// on clique sur stop :
            // on change la commande du btn
            StopBtn.isHidden = true
            StartBtn.isHidden = false
            // on stop le timmer 
            StopTimer()
            // On questionne l'utilisateur pour connaitre son lieu de depart 
            VarDepart = AskDepart()
            TestLbl.text = String(VarDepart)
            print("VarDepart après return: \(VarDepart)")
            FlightTimeLbl.isHidden = true
        }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    func AskDepart()->String{
            // on ouvre une alert pour demander le lieu de depart
            let Dpalert = UIAlertController(title: nil, message: "Lieu de depart ?", preferredStyle: .alert)
     
            Dpalert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
     
            Dpalert.addTextField(configurationHandler: { textField in
                textField.placeholder = "Lieu de depart"
                textField.textAlignment = .center
     
            })
     
            Dpalert.addAction(UIAlertAction(title: "Next", style: .default, handler: { action in
     
                if let depart = Dpalert.textFields?.first?.text {
                    print("Departure : \(depart)") // juste pour verifier le bon fonctionnement
     
                    self.VarDepart = String(depart)
                    print("VarDepart : \(self.VarDepart)") // pour verifier le passage de depart dans la variable générale VarDepart et pour faire un Return de la réponse User
                }
            }))
     
            self.present(Dpalert, animated: true)
     
            return VarDepart
     
        }
    Je ne sais pas vraiment pourquoi mon code n'attend pas la fin de la fonction AskDepart() pour passer à la suite de la fonction StopFlight ...

    Merci d'avance pour vos précieux conseils !

    Flyer-73

  2. #2
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    1) Avant toute chose :
    Utilise le CamelCase ! Ca facilitera la lecture / Lisibilité / comprehension de ton code.. S'il y a des conventions, il faut les utiliser !
    Pour le moment, c'est un peu n'importe quoi, ca me donne vraiment pas envie de lire ton code :
    https://fr.wikipedia.org/wiki/Camel_case

    2) Pour ton problème :
    Bha... en faite, ce qui ce passer est tout à fait logique. Je reprend ton code en virant tous les trucs inutile pour l'explication.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    @IBAction func StopFlight(_ sender: Any) {
    //On viens de cliquer sur le bouton et on appelle la methode AskDepart et on attend une valeur de retour que le met dans valDepart :
            VarDepart = AskDepart() 
    ....
    }
     
    func AskDepart()->String{
    // On crée une alert
            let Dpalert = UIAlertController(title: nil, message: "Lieu de depart ?", preferredStyle: .alert)
    // Bouton cancel, aucune action dans le programme
            Dpalert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
     
     // Bouton Next, ICI on fait une action lorsque l'utilisateur clique sur un bouton, l'action se trouve dans le "handler"
            Dpalert.addAction(UIAlertAction(title: "Next", style: .default, handler: { action in
     // On fait des trucs avec varDepart
                  self.VarDepart = String(depart)
                }
            }))
     // On affiche la popup
            self.present(Dpalert, animated: true)
     
     // On retourne varDepart, qui en faite n'a pas été modifié dans la method AskDepart, même valeur qu'avant
            return VarDepart
        }
    - Pourquoi le varDepart retourné est le même qu'avant l'appelle à AskDepart ?
    Parceque ton code s'execute ligne / ligne, certe tu as déclaré une action (qui modifie varDepart) mais qui ne sera exécuté uniquement lors du clique sur le bouton, pendant se temps, ton code ne s'arrete pas, il continue a se dérouler jusqu'a la fin de la fonction.

    - Bha alors, comment qu'on fait ?

    Il faut tout simplement mettre ton code dans le Handler de l'action (ou appeler une fonction depuis le handler) !

    Ca devrait ressembler un truc dans le genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    func askDepart() {
    // On crée une alert
            let dpalert = UIAlertController(title: nil, message: "Lieu de depart ?", preferredStyle: .alert)
    // Bouton cancel, aucune action dans le programme
            dpalert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
     
     // Bouton Next, ICI on fait une action lorsque l'utilisateur clique sur un bouton, l'action se trouve dans le "handler"
            dpalert.addAction(UIAlertAction(title: "Next", style: .default, handler: { action in
     // On fait des trucs avec varDepart
                  self.varDepart = String(depart)
                  testLbl.text = String(varDepart)
                  print("varDepart après return: \(varDepart)")
                  flightTimeLbl.isHidden = true
                }
            }))
     // On affiche la popup
            self.present(dpalert, animated: true)
        }
    "Quand la lune n'est pas là, la nuit mène une existence obscure"

Discussions similaires

  1. [PowerShell] Attendre la fin d'une exécution pour passer à la suivante
    Par AntoLili dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 18/09/2018, 09h58
  2. [XL-2007] Attendre la selection d'un graphique pour demarrer un bout de code
    Par odjapo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/02/2015, 10h15
  3. [Python 2.X] attendre une réponse de l'utilisateur
    Par alexfau dans le forum Tkinter
    Réponses: 1
    Dernier message: 27/11/2014, 21h13
  4. Attendre qu'une touche soit appuyée pour passer à la suite
    Par Bad Bond dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 13/08/2012, 22h06
  5. Attendre la réponse de l'utilisateur
    Par sandrillon dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 25/06/2009, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo