UItextfield et clavier

JekarJekar Membre
08:07 modifié dans API UIKit #1
Bonjour,
2 questions :
- comment desactiver l apparition du clavier?
- j'ai cree mon propre clavier avec des boutons et j'ai 2 UItextfield. COmment sélectionner un textfield, et comment savoir lequel est selectionné?

Merci

Réponses

  • CeetixCeetix Membre
    08:07 modifié #2
    Je t'aurai bien aidé mais c'est déjà  fait et ce ne fut pas concluant bien que les idées etaient là  ^^
  • Philippe49Philippe49 Membre
    08:07 modifié #3
    dans 1236705438:

    - comment desactiver l apparition du clavier?


    -(BOOL) textFieldShouldreturn:(UITextField *) textField {
      [textField resignFirstResponder];
      ....
    }
  • Philippe49Philippe49 Membre
    08:07 modifié #4
    dans 1236705438:

    - j'ai cree mon propre clavier avec des boutons et j'ai 2 UItextfield. COmment sélectionner un textfield, et comment savoir lequel est selectionné?


    Lequel est selectionné : en général les delegate method indique le textField en argument. Donc un if(textField==firstTextField) .

    Sélectionner un TextField c'est le rôle de l'utilisateur de faire cela, mais autrement peut-être que les méthodes UIControl peuvent t'aider :

    selected
    A Boolean value that determines the receiver's selected state.

    @property(nonatomic, getter=isSelected) BOOL selected
    Discussion
    Specify YES if the control is selected; otherwise NO. The default is NO. For many controls, this state has no effect on behavior or appearance. But other subclasses (for example, UISwitchControl) or the application object might read or set this control state.
  • CeetixCeetix Membre
    08:07 modifié #5
    Avec Jekar on avait essayé d'implémenter ca.
    Pour le blocage du clavier j'avais reussi.

    Apres pour savoir si un textField etait selectionné on testait dans chaque IBAction
    textField.isSelected . Si YES alors on écrivait dedans un truc. Mais ça ne marchait pas.
    C'est bien le même principe que tu mets en évidence ici Philippe?
  • Philippe49Philippe49 Membre
    08:07 modifié #6
    dans 1236713640:

    dans 1236705438:

    - comment desactiver l apparition du clavier?


    -(BOOL) textFieldShouldreturn:(UITextField *) textField {
       [textField resignFirstResponder];
       ....
    }



    Ah oui si j'ai mal compris et que tu veux que le text field ne présente pas le key board
    textField.enabled=NO;
  • Philippe49Philippe49 Membre
    08:07 modifié #7
    dans 1236714491:

    Apres pour savoir si un textField etait selectionné on testait dans chaque IBAction
    textField.isSelected . Si YES alors on écrivait dedans un truc. Mais ça ne marchait pas.
    C'est bien le même principe que tu mets en évidence ici Philippe?


    Effectivement la property selected pour un UITextField a l'air verrouillée à  l'essai. Il faut se débrouiller avec enabled.
  • CeetixCeetix Membre
    mars 2009 modifié #8
    Ok j'ai testé et ca marche super.
    Sauf que Jekar aimerai écrire dans deux textField différents et donc quand il appuie sur un bouton, ecrire dans le textField qu'il a sélectionné.
    Le soucis c'est qu'avec textField.enabled = NO ; on ne peut plus selectionner :s

    edit : ok mais alors c'est impossible ^^. Faudrait mettre une radiobox pour savoir dans le quel on veut ecrire, ce serait plus simple. Enfin Jekar nous le dira.
  • Philippe49Philippe49 Membre
    mars 2009 modifié #9
    dans 1236719025:

    Ok j'ai testé et ca marche super.
    Sauf que Jekar aimerai écrire dans deux textField différents et donc quand il appuie sur un bouton, ecrire dans le textField qu'il a sélectionné.

    Une solution :
    - repérer la position d'un touch dans le view controller ,  avoir une variable dans ce view controller qui mémorise le textfield selectionné que l'on renseigne selon que le touch a lieu dans le premier ou le second text field.

    Plus propre :
    - sous-classer UITextField et rendre active la property selected avec la réaction au touch. On implémentera dans cette sous-classe le touchesBegan: withEvent:
    cette deuxième solution est plus propre mais demande d'envoyer au delegate (le view controller sans doute) un message comme quoi le textField vient d'être sélectionné. A lui de déselectionner l'autre textfield en réponse à  ce message.

    [EDIT] ça ne marchera pas à  cause du conflit avec le keyboard, voir plus loin

  • CeetixCeetix Membre
    08:07 modifié #10
    Pour la première solution il faut connaà®tre la position et taille du textField ? Je sais pas si j'ai bien compris. En fait ton textField deviendrai comme un simple dessin rectangulaire.
  • Philippe49Philippe49 Membre
    08:07 modifié #11
    dans 1236720052:

    Pour la première solution il faut connaà®tre la position et taille du textField ? Je sais pas si j'ai bien compris. En fait ton textField deviendrai comme un simple dessin rectangulaire.

    Les text fields sont sans doute en IBOutlet du view controller, donc on connaà®t leur frame. DOnc on teste si la "location" du touch est dans ce rectangle. Mais je préfère la deuxième solution, plus propre et réutilisable.
  • CeetixCeetix Membre
    08:07 modifié #12
    Hum ok. Bah vu que je vois pas trop comment faire, Jekar à  toi de jouer :p
  • JekarJekar Membre
    08:07 modifié #13
    Merci,
    je vais essayer tout ca!  :p
  • Philippe49Philippe49 Membre
    mars 2009 modifié #14
    Après essai, pour maà®triser l'apparition du keyboard, et en conserver la possibilité, il vaut mieux  redéfinir la méthode becomeFirstResponder

    Dans MyTextField.h
    @interface MyTextField : UITextField {
    BOOL selected;
    }
    @property BOOL selected;
    @end


    Dans MyTextField.m
    @synthesize selected;
    - (BOOL)becomeFirstResponder {
    NSLog(@%@",self.delegate);
    selected=!selected;
    [self.delegate performSelector:@selector(selectionChangedFor:) withObject:self];

    // [super becomeFirstResponder]; lance le mécanisme du keyboard
    return YES;
    }

    Dans le delegate :
    -(void) selectionChangedFor:(UITextField *) aTextField {
    NSLog(@appel de selectionChangedFor);
    }

    [EDIT] il serait par ailleurs plus prudent de faire précéder
    [self.delegate performSelector:@selector(selectionChangedFor:) withObject:self];
    par un test if([self.delegate respondsToSelector:@selector(selectionChangedFor:)])
Connectez-vous ou Inscrivez-vous pour répondre.