iOS : activer un bouton avec des conditions

maitomaito Membre

Bonjour, je souhaite activer ou non un bouton lorsque plusieurs valeurs seront écrite. Cependant cela ne marche pas comme je le souhaiterais. Voici mon code (http://hpics.li/bccee71) , j'utilise un segment control. Pour info voici mon main : http://hpics.li/64869e0 


Lorsque j'entre les valeurs dans les 2 encadré le bouton "tracer la courbe" n'est pas 'enable'


Autre chose , n'auriez vous pas un bon tuto (ou autre) pour savoir manier le debuger d'xcode ?


Merci infiniment pour votre aide.


 

Réponses

  • samirsamir Membre
    mars 2015 modifié #2

    Bonjour,


     


    Vu que c'est ton premier message sur le forum, je t'invite a te présenter dans la section "présentation des membres" pour qu'on sache ton niveau et adapter les réponse.


     


    Sinon pour ton problème, revoie les condition de tests. par exemple ça :



    if entréeB.text == "" && entréeB.text = "Valeur de b" {

    }

    Ne peut jamais ce réaliser, parce que le texte ne peut pas avoir deux valeur à  la fois.


  • maitomaito Membre
    mars 2015 modifié #3

    Merci pour ta réponse,


     


    Je ne savais pas , je me présenterais dès que possible.


     


    J'ai tenu compte de ton conseil et j'ai remplacer les && par || mais le problème est que lorsque je rentre une valeur pour "a" et que je clique pour aller rentrer "b" le bouton "tracer courbe" s'active , or b est égal a "" si je n'ai rien entré ? Et c'est pas ce que je souhaite.


     


     


    edit : Je viens de voir que lorsque je rentre la valeur de a tout va bien mais lorsque je clique pour rentrer la valeur de b le 'if else' se finit et b prend pour valeur "Valeur de b"... je trouve ça bizarre ... voici le code : http://hpics.li/7e77439


  • LarmeLarme Membre

    Merci de copier/coller ici le code (et de mettre ça dans la balise CODE) plutôt que des screenshots.

    D'une part, c'est plus facilement lisible pour nous, si on veut prendre ton code et le modifier afin de te montrer des incohérences, des solutions, etc, c'est plus simple pour nous de le copier/coller que d'avoir tout à  se retaper à  la main, et ensuite, si ton lien meurt, si quelqu'un a le même soucis, il aura du mal à  comprendre.


  • Si tu as copié le code de samir : 



    if entréeB.text == "" && entréeB.text = "Valeur de b" {

    }

    Fais attention au simple "=" qui attribut la valeur à  ta variable je penses qu'ici un "==" serait mieux. 

  • maitomaito Membre
    mars 2015 modifié #6

    @IBAction func bouttonTracer(sender: AnyObject) {
    do {
    decounte++
    switch Choixb.selectedSegmentIndex {



    case 0:



    if ((entréeA.text != "") && (entréeA.text != "Valeur de a")) && ((entréeB.text != "") && (entréeB.text != "Valeur de b")){

    self.tracerCourbe.enabled = true
    }



    else {

    self.tracerCourbe.enabled = false

    }
    println("entréb=\(entréeB.text)")
    println("entréa=\(entréeA.text)")
    println("\(tracerCourbe.enabled)")
    break;


    case 1:

    if entréeA.text != "" && entréeA.text != "Valeur de a" {

    self.tracerCourbe.enabled = true
    println("entréa=\(entréeA.text)")
    println("\(tracerCourbe.enabled)")

    }

    else {

    self.tracerCourbe.enabled = false
    println("entréa=\(entréeA.text)")
    println("\(tracerCourbe.enabled)")

    }
    println("entréa=\(entréeA.text)")
    println("\(tracerCourbe.enabled)")

    break;

    default:
    break;

    }
    }while decounte == 0
    }
     

    Oui c'est vrai tu as raison , voici le code. Le problème est celui que j'ai cité plus haut , pour info si j'entre une valeur pour a et pour b, les printf me retourne ces valeurs : entréeA = 2 (par exemple)     entréeB = valeur de b  tracercourbe.enable = false


  • Peut-être vaudrait-il montrer un peu de l'UI car le code seul me semble peu explicite.


    A quoi sert la boucle while decounte == 0 ?


    Pourquoi le test est si bizarre ou complexe ?


  • AliGatorAliGator Membre, Modérateur
    mars 2015 modifié #8
    - Une boucle do...while dans une IBAction ? Pour un truc qui traite de l'UI ?
    - Qui en plus sort si "decounte == 0" alors que la seule chose que tu fais sur cette variable "decounte"... c'est de l'incrémenter ?
    - Des valeurs de texte en dur qui sortent de nulle-part ? (Ces textes "Valeur de a" et "Valeur de b" en plus... pourquoi ne pas utiliser la propriété "plaheholder" de UITextField si c'est pour mettre un texte indicatif dans le champ pour inciter à  la saisie ?)


    Et au delà  de ça, je ne comprends pas trop ta logique de code...
    --> C'est lorsqu'il y a une IBAction sur ton bouton que tu vas alors changer l'état de ton bouton selon la valeur de tes champs ? Tu ne devrais pas plutôt chercher à  désactiver ton bouton tracerCourbe avant d'attendre qu'il soit cliqué pour changer son état ?! Pas très logique tout ça...

    En fait, au delà  de l'aspect pur code, j'ai du mal à  voir la réflexion qui t'a amené à  écrire ce genre de logique de code, parce que là  j'ai du mal à  voir ce que toi tu avais en tête derrière en écrivant un tel code... une boucle infinie quand on clic sur le bouton, pour désactiver ou non le bouton lui-même ?! Qu'est ce que tu voulais faire / souhaitait que ton code fasse en écrivant ce genre de code en fait ?
  • maitomaito Membre

    Effectivement , passons sur le do while (que j'ai supprimé )


    En fait je voulais connaitre les valeur de a et de b avec les println, ça n'en pas vraiment dans le code et ça ne vaut pas le coup de s'arrêter la dessus.


    Mon BUT premier et de demander les valeur de a et de b , cependant lorsque j'entre les valeurs pour a , tout va bien mais lorsque je rentre la valeur de b , le bouton tracer courbe n'est toujours pas "enable". Voila tout, je ne comprend vraiment pas pourquoi a prend la valeur du nombre entré mais b prend la valeur de "valeur de b". 


    PS: dans les caractéristique du bouton 'tracer courbe' j'ai décoché le bouton enable.


  • AliGatorAliGator Membre, Modérateur
    Nan mais c'est pas vraiment la question en fait.

    Ce que je ne comprends toujours pas, c'est pourquoi tu mets tout ce code, qui dicte les conditions pour savoir quand "enable" ou pas le bouton... dans le code exécuté par le bouton lui-même ?

    Ce n'est pas quand tu cliques sur le bouton que tu veux alors changer son état "enabled" à  YES ou NO... ça n'a pas de sens de griser ou non le bouton seulement quand tu tapes dessus ?! C'est cette logique que je ne comprend pas en fait.

    Ce code il ne faut pas le mettre dans le code exécuté lors du tap sur le bouton... il est à  mettre dans une méthode exécutée quand le texte d'un de tes 2 champs change, puisque c'est quand tu changes le texte dans ces champs qu'il faut recalculer si le bouton doit être enabled ou pas... non ? Enfin je sais pas, ça me paraà®trait quand même plus logique plutôt que de calculer ça au moment où le bouton est pressé, non ?!
  • Alors je voudrais que le bouton ne soit enable SEULEMENT quand la valeur pour a est entrée et de même pour b.J'ai mis un texte de base qui se supprime quand on clique sur le text field qui est "Valeur de A(ou)B". Je veux donc que le bouton sois enable quand b n'est pas égal a "" ou et ""Valeur de b" et de meme pour a. C'est ce que j'ai voulu représenter dans ce code. Bon apparement je ne m'y suis pas pris de la bonne manière ? As-tu compris ce que je voulais faire ? 


    Merci pour ton aide.


  • AliGatorAliGator Membre, Modérateur
    Ok donc j'avais bien compris d'après tes explications et mes suppositions ce que tu VOULAIS faire.
    Et j'avais bien compris que ton code ne retranscrivais pas du tout ce que tu voulais faire.

    Donc je réitère, ce n'est pas logique, tu es incohérent avec toi-même. Tu dis que tu veux modifier le bouton quand le texte change, mais tu écris du code qui modifie le bouton seulement quand l'utilisateur tape sur le bouton... J'ai du mal à  comprendre que tu ne voies pas l'incohérence ici, c'est juste pas logique, c'est juste pas du tout ce que tu veux faire...
  • maitomaito Membre
    mars 2015 modifié #13

    Non je veux que le bouton sois enable lorsque les valeur de a et de b sont entrées c'est ce que mes conditions signifient ... enfin du moins c'est ce que je croyais! 


  • Joanna CarterJoanna Carter Membre, Modérateur

    J'ai mis un texte de base qui se supprime quand on clique sur le text field qui est "Valeur de A(ou)B".




    Comme dit Ali, c'est pas nécessaire. Il'vaut mieux à  mettre ton texte de base dans le propriété "placeholder"
  • AliGatorAliGator Membre, Modérateur
    Tes conditions peut-être, mais l'endroit où tu as mis le code (c'est à  dire dans l'IBAction = le code exécuté quand le bouton est tapé) lui n'est pas bon.

    Mais bon ça fait 5 ou 6 messages que je le répète, je commence à  me lasser.
  • D'accord c'est bon j'ai compris. Merci beaucoup pour votre aide et a bientôt sur le forum


  • Tu as compris où il faut mettre le code? Ou tu as l'impression qu'on veut pas t'aider? Parce que tu as tout ce qu'il faut pour réussir.


    Pour regrouper tous les messages d'Ali qui a mieux réussi que toi a nous faire comprendre ton souci : 


     


    - Il vaut mieux se servir de la propriété placeholder pour afficher un text explicatif dans les textField (ça évite le souci de la verification si mon texte est égal à  "valeur de A").


    - Il vaut mieux faire les tests sur les valeurs de tes textes pendant la saisi de l'utilisateur donc hors de l'IBAction car sinon l'utilisateur va voir un bouton cliquable alors que ce n'est potentiellement pas le cas.


     


    Pour moi la meilleurs solution qui reprends un peu tout ça : 


     


    - Utilisation des placeholder


    - Laisser le bouton toujours actif 


    - Et du coup faire le control sur le IBAction (option valable que si on ne désactive pas le bouton)


    - Et afficher le cas échéant un message explicite sur le cas qui empêche l'execution de l'action.


     


    Bloquer un bouton n'est pour moi pas la bonne solution car on ne peut pas expliquer a l'utilisateur pourquoi l'action est impossible.


  • maitomaito Membre
    mars 2015 modifié #18

    C'est gentil Nasatya d'avoir répondu, je vais travailler sur ça car je n'ai pas encore réussis et je reviendrai ici si j'ai un soucis!


Connectez-vous ou Inscrivez-vous pour répondre.