NSTextField formatter à  la volée

Bonjour,



J'aimerai bien obliger un utilisateur à  ne saisir que des chiffres dans un NSTextField.

Un grand classique.



J'ai essayé d'associer un NSNumberFormatter à  mon NSTextField mais cela ne fonctionne pas du tout comme je le supposais. Tout ce que j'arrive à  faire avec NSNumberFormatter, c'est de formater le résultat de la saisie mais pas empêcher une frappe de lettre par exemple.



Avec quoi peut-on réaliser cela?

Réponses

  • Tu peux passer par une méthode qui est appelé à  chaque modification du textField (valueDidChange) et checker si c'est le dernier caractère est un chiffre. Si ça n'est pas le cas tu l'enlèves.
  • D'ailleurs je me pose une question : ça fonctionne dans toutes les langues ce genre de test ?
  • Tu as aussi la fonction C 'isdigit' pour checker si un caractère est numérique ou non.
  • 'Ceetix' a écrit:


    Tu peux passer par une méthode qui est appelé à  chaque modification du textField (valueDidChange) et checker si c'est le dernier caractère est un chiffre. Si ça n'est pas le cas tu l'enlèves.


    Oui mais attention, il ne faut pas regarder que le dernier caractère car l'utilisateur peut en ajouter plusieurs d'un coup avec un copier/coller ! image/wink.png' class='bbc_emoticon' alt=';)' />
  • Bien joué Alf j'avais totalement omis ce genre de perversité !
  • AliGatorAliGator Membre, Modérateur
    'Ceetix' a écrit:


    Tu peux passer par une méthode qui est appelé à  chaque modification du textField (valueDidChange) et checker si c'est le dernier caractère est un chiffre. Si ça n'est pas le cas tu l'enlèves.
    Heu depuis quand on ne peut insérer du texte dans un TextField qu'à  la fin ?



    On peut mettre le curseur en plein milieu et taper une touche à  cet endroit, ou même coller du texte issu du presse-papier (qui peut contenir plusieurs caractères), et même sélectionner du texte et le remplacer par un autre texte (qu'on tape ou par copier/coller)...



    Bref c'est loin de se limiter au dernier caractère du TextField, ça peut être un caractère n'importe où, voire un texte complet copié/collé.
  • Waouh, en plus j'ai grillé Ali. image/wink.png' class='bbc_emoticon' alt=';)' />)
  • Oui dans mon esprit j'étais sur une saisi normale.
  • 'Ceetix' a écrit:


    Tu peux passer par une méthode qui est appelé à  chaque modification du textField (valueDidChange) et checker si c'est le dernier caractère est un chiffre. Si ça n'est pas le cas tu l'enlèves.




    Oui, c'est que j'ai finalement fait mais je ne comprends pas du tout l'intérêt du "NSNumberFormatter" que l'on ajoute avec IB. A quoi sert de paramètrer le NSNumberFormatter si c'est pour réécrire une méthode qui teste la saisie?
  • CéroceCéroce Membre, Modérateur
    ça fonctionne chez moi. En plaçant le NSNumberFormatter en mode "Decimal".
  • 'Céroce' a écrit:


    ça fonctionne chez moi. En plaçant le NSNumberFormatter en mode "Decimal".




    Ce que j'avais fait. Mais en décochant/recochant, ça c'est mis à  fonctionner... Enfin sans méthode appelée par notification, ça ne fonctionne pas du tout. Vraiment curieux.
  • epetit91epetit91 Membre
    avril 2012 modifié #13
    Bonsoir Rocou,



    Dans mon post du 12/02/2012 (Fonctionnement du délégué "controlTextDidChange"), j'avais le même problème que toi sachant en plus que je souhaitais limiter la valeur max saisie.



    Voici comment j'ai résolu mon problème :


    <br />
    - (void)controlTextDidChange:(NSNotification *)notification<br />
    {<br />
        NSString    *valeur = [txtChampNumero stringValue];<br />
        //  Le dernier caractère saisi est un chiffre : renvoie la valeur dans le champ<br />
        if ([valeur characterAtIndex: [valeur length]-1] &gt;= &#39;0&#39; &amp;amp;&amp;amp; [valeur characterAtIndex: [valeur length]-1] &lt;= &#39;9&#39;)<br />
    		    [txtChampNumero stringValue];<br />
        //  Le dernier caractère saisi est une lettre<br />
        else<br />
        {<br />
    	//  Si le champ n&#39;est pas vide<br />
    	//  Permet d&#39;éviter une exception si après avoir saisi un caractère numérique on appui sur la touche &quot;Retour arrière&quot;<br />
    	if ([valeur length] &#33;= 0)<br />
    	 {<br />
    		//  Récupération des (n-1) caractères de la chaà®ne et renvoi dans le champ<br />
    		//  Nota : le texte du champ se trouve alors sélectionné<br />
    		[txtChampNumero setStringValue:[valeur substringToIndex:[valeur length]-1]];<br />
    				  <br />
    		//  Désectionne le texte du champ en positionnant le curseur à  la fin du texte<br />
    		[[txtChampNumero currentEditor] setSelectedRange: NSMakeRange([valeur length]-1, 0)];<br />
    	}<br />
        }<br />
    }<br />
    




    Parallèlement à  cela, un "Number Formatter" teste les limites de la valeur numérique saisie (min et max).



    Je n'ai pas trouvé plus simple mais cela fonctionne parfaitement.
  • epetit91, merci, je teste cela dès que possible.
Connectez-vous ou Inscrivez-vous pour répondre.