[Cocoa] sous classe de NSNumberFormatter

.mok.

Membre confirmé
30 Avril 2007
17
1
Salut tout le monde :zen:

Voilà, j'ai un léger problème sous Cocoa, que je commence à apprendre petit à petit... J'ai besoin de formatter un champ pour une ip, donc pour faire simple j'ai divisé mon ip en 4 champs NSTextfield : XXX XXX XXX XXX . Je récupérerai ensuite la valeur et la formatterai de façon adéquate.

Pour éviter que l'utilisateur ne rentre des caractères autres que des numéros, j'ai sous classé un NSNumberFormatter que j'ai appellé ipAddress . J'ai donc utilisé une méthode isPartialStringValid pour empécher la saisie de caractères alphabétiques et de symboles, j'ai ensuite lié mon formatteur a mon TextField. Tout ça marche très bien. Seuls les chiffres sont pris en compte.

Le problème c'est qu'a chaque fois que je passe à un autre champ en appuyant sur tab par exemple, j'ai un .00 qui apparait derriere mes 3 chiffres !

Je pense que je dois réécrire certaines méthodes qui sont héritées de NSNumberFormatter, mais j'ai pas mal cherché et je ne trouve pas ! Il ya surement des choses que je n'ai pas comprises donc soyez indulgents :love:

Merci pour votre aide !
 
A mon avis, il serait plus judicieux d'utiliser 1 seul instance 'NSTextField' en cohésion avec un 'NSFormatter' :

exemple de zone formattée : "####.####.####.####"

les caractères # représente les 'char' éditable grâce à NSTextField, il faudrait configurer NSTextField pour qu'il n'accepte en entrée QUE des chiffres numériques !
 
je ne trouve pas quelles méthodes servent à définir l'affichage :

il me faudrait simplement ### : 3 chiffres, pas de virgule ni rien...
 
je ne sais pas exactement quelle méthode il faut choisir mais :

- (NSString *)editingStringForObjectValue:(id)anObject

celle-ci est une méthode intéressante, car une fois qu'elle est surchargée, si ton objet dérivée de NSTextField contient un objet AdresseReseau

@interface AdresseReseau
{
short int left;
short int middle;
short int right;
}

en passant AdresseReseau en argument, tu pourrais le mapper en une chaine NSString

j'ai trouvé un lien qui te fournira un code beaucoup plus propre pour apprendre à utiliser NSFormatter et cela se trouve à cet endroit
 
Merci beaucoup Claw59 ;)

Je venais juste de tomber sur cette page quelques minutes avant de voir ta réponse, comme quoi :up:

J'ai réussi à enlever les .00 qui m'énervaient, je vais bien regarder tout ça en détail ;)
Merci encore:love:
 
Bon j'ai regardé un peu editingStringForObjectValue, et à vrai dire, je ne vois pas trop à quoi cela correspond,

When implementing a subclass, override this method only when the string that users see and the string that they edit are different.

Ceci dit, j'ai réussi à faire quelques petites choses :
- minimum 0 maximum 255 (ne valide pas sinon)
- enlever le .00 qui se rajoutait automatiquement
- interdire l'utilisation de lettres à la frappe

Je pense qu'une dernière methode qui permettrait de rentrer au maximum 3 chiffres serait la bienvenue, j'ai trouvé la méthode maximumIntegerDigits mais elle n'a pas l'air de marcher, ou je m'en sert très mal ? (il suffit de retourner un unsigned int égal à trois non?)
 
Bon j'ai regardé un peu editingStringForObjectValue, et à vrai dire, je ne vois pas trop à quoi cela correspond,



Ceci dit, j'ai réussi à faire quelques petites choses :
- minimum 0 maximum 255 (ne valide pas sinon)
- enlever le .00 qui se rajoutait automatiquement
- interdire l'utilisation de lettres à la frappe

Je pense qu'une dernière methode qui permettrait de rentrer au maximum 3 chiffres serait la bienvenue, j'ai trouvé la méthode maximumIntegerDigits mais elle n'a pas l'air de marcher, ou je m'en sert très mal ? (il suffit de retourner un unsigned int égal à trois non?)
Mais si tu as déjà "minimum 0 maximum 255 (ne valide pas sinon)" alors tu n'as pas besoin de limiter à trois chiffres vu qu'avec plus de trois chiffres c'est forcément superieur à 255 non ?

Il suffit de supprimmer automatiquement les zéro de gauche si il y en a et qu'il y a plus qu'un chiffre (vu que la seule possibilité de nombre à plus de 3 chiffres mais pas superieur à 255 c'est 0123 par exemple ou 0002 etc...)


Mais peut-être que je suis complètement à l'ouest :)
 
Salut p4bl0,

oui en effet ça ne sert pas a grand chose de limiter le nombre de caractères à trois, mais personnellement je trouve ça un peu plus propre (vu que ce sont des petits textfields, si on rentre + de 3 caractères y'a des chiffres qu'on ne voit plus, et c'est laid :D)

pour l'histoire du zéro, apparement c'est géré automatiquement (disons que quand je rentre 0123 par exemple, ça écrit 123 dans le textfield)
 
En fait j'ai réussi à bloquer au dessus de 3 chiffres en rajoutant deux lignes de code sur la méthode isPartialStringValid :)

EDIT : bah ouais mais après je peux plus supprimer ce que j'ai rentré :eek:
 
Salut p4bl0,

oui en effet ça ne sert pas a grand chose de limiter le nombre de caractères à trois, mais personnellement je trouve ça un peu plus propre (vu que ce sont des petits textfields, si on rentre + de 3 caractères y'a des chiffres qu'on ne voit plus, et c'est laid :D)

pour l'histoire du zéro, apparement c'est géré automatiquement (disons que quand je rentre 0123 par exemple, ça écrit 123 dans le textfield)
Ok, mais je comprend toujours pas comment on peut entrer un nombre à 4 chiffres si le nombre doit être "minimum 0 maximum 255 (ne valide pas sinon)" et que "l'histoire du zéro, apparement c'est géré automatiquement" :nailbiting:


M'enfin c'est pas très important que je comprenne pas, j'espère que tu réussira à résoudre ton problème ;)
 
Ben en fait, quand on met un maximum à 255, le champs peut toujours afficher des valeurs au dessus de 255 mais ne peut pas les valider en appuyant sur tab pour passer au champs suivant par exemple.

Ce qui serait super comme validation c'est de regarder si le premier chiffre entré est entre 0 et 2, le second entre 0 et 5, le troisieme idem, mais ça ne marche pas comme ça. En fait faudrait le faire je pense avec isPartialStringValid, mais ça me parait beaucoup trop compliqué pour moi :'(
 
Ben en fait, quand on met un maximum à 255, le champs peut toujours afficher des valeurs au dessus de 255 mais ne peut pas les valider en appuyant sur tab pour passer au champs suivant par exemple.

Ce qui serait super comme validation c'est de regarder si le premier chiffre entré est entre 0 et 2, le second entre 0 et 5, le troisieme idem, mais ça ne marche pas comme ça. En fait faudrait le faire je pense avec isPartialStringValid, mais ça me parait beaucoup trop compliqué pour moi :'(
Ah non surtout pas le second entre 0 et 5 !! 187 c'est valide par exemple :p
 
ah oui je suis con pour le 0 et le 5 ^^ il se fait tard :eek:

je vais regarder ce que tu m'as donné :zen::up:

edit : :p oui oui c'est moi :D
 
ah oui je suis con pour le 0 et le 5 ^^ il se fait tard :eek:

je vais regarder ce que tu m'as donné :zen::up:

edit : :p oui oui c'est moi :D
Le WBIPv4Control m'a l'air d'être tout à fait ce que tu cherche :
WBIPv4Control.JPG


:)
 
Tu as trouvé ça où ?

En fait je viens justement de finir ma classe IpV4 je crois :D J'ai trouvé ce qui foirait, maintenant j'ai réussi a quasiment bloquer toutes les erreurs possibles...
 
on pourrai aussi imaginer le fonctionnement d'un objet

@interface AdressReseau
{

struct AdrReseau adrResau;

}

gérant cette structure de manière dynamique:

typedef union AdrReseau
{

typedef struct Ipv4 {....}

typedef struct Ipv6 {....}

}