Formatter qui rend fous...

chaps31chaps31 Membre
09:04 modifié dans API AppKit #1
Là  je sens qu'il faut que j'arrête de coder aujourd'hui sinon je vais devenir fou...  :crackboom:-

J'utilise pour différents NSTextField des Formatter. Un pour les noms propres, un pour tout en majuscule... Je les crée dans XCode puis les instancie dans IB puis lie mes textfield  au formatter adequat. Tout marche impeccable ça formate, ça formate.

Mais j'ai aussi des NSTextField qui contiennent des nombres (valeurs monétaires pour certains,  pourcentages pour d'autres). Génial IB a déjà  des NSNumberFormatter tout prêt, je les glisse-dépose directement sur mes NSTextField, hop une petite icone de formatter s'y attache, je clique dessus hop je peux régler ses attributs, y'a pas à  dire c'est beau ergonomique, simple...  :adios!:

Sauf que... Ces derniers NSNumberFormatter ne sont pas pris en compte !!!  :crackboom:-  Lorsque je lance mon appli, que dalle pas de formatage des NSTextField... Au secours, que se passe-t'il ? Pire je ne trouve nulle part une explication simple de leur fonctionnement... pour implémenter des Formatter dans XCode pas de problème mais sous IB, rien niet nada, doc apple, mon bouquin, Google... Arrgh... Heureusement il y a Objective-cocoa... Vous êtes mon seul espoir...

Merci

Réponses

  • Philippe49Philippe49 Membre
    09:04 modifié #2
    Tu as fait ce qu'il falliait. A moins d'une erreur dans les réglages ..

    Essaie déjà  de nettoyer la cible "Clean All targets", tu en as déjà  tellement fait ..

  • chaps31chaps31 Membre
    09:04 modifié #3
    Désolé pour mes lacunes, mais "Clean all target" ça fait quoi au juste et comment je fais ?  :o
  • Philippe49Philippe49 Membre
    09:04 modifié #4
    C'est dans le menu Build.

    La compilation sous XCode est (comme) un makefile, ce qui a déjà  été compilé ne l'est pas de nouveau.
    De temps en temps, des changements ne sont pas pris en compte comme on l'espèrerait . C'est peut-être ce qui t'arrive : un save pas fait dans IB, par exemple, ou je ne sais quoi.  
  • chaps31chaps31 Membre
    09:04 modifié #5
    Malheureusement rien n'y fait... Ce qui est fou ce que par contre les NSFormatter codés dans XCode et instanciés dans IB eux fonctionnent très bien, c'est juste les NSNumberFormatter... Au début je les avais instanciés dans IB puis j'ai découvert le glisser-déposer direct sur mon TextField... Il n'y a pas un réglage dans le NSNumberFormatter qui m'échappe ? Je règle juste sur "percent" par exemple, mais je ne vois rien d'autre à  faire... Incroyable que ça ne marche pas...
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #6
    Il y a d'autre choses à  faire ...

    • Créer un nib Cocoa vierge en dehors de ton projet
    • Mets dedans un NXTextField et un NSNumberFormatter
    • Choisis un réglage et fais Run dans IB, et Quit

    Ajuste ainsi ton formatter à  ce que tu veux
  • Philippe49Philippe49 Membre
    décembre 2008 modifié #7
    Un essai avec le style sur none

    Nombre de décimales : [minimum fraction digit = 1 , maximum fraction digit = 2]  
    Nombre de chiffres avant la virgule : [minimum integer digit = 2 , maximum integer digit = 42] exemple : [2,42]   
    code :   #00.0#

    Padding sur Before Prefix
    width=8 (nombre total de caractères) en complétant avec choix du caractère=^
    code : *^###00.0#

    Essai   45,236 s'écrit  ^^^45,24


    Pour essayer percent, il faut que % soit dans la chaà®ne inscrite par l'utilsateur
  • chaps31chaps31 Membre
    09:04 modifié #8
    Bonne année  <3 <3 <3 <br />
    Bon je fais me faire taper dessus, le Jurançon se réchauffe... Mais c'est la galère, je progresse avec cette NSNumberFormatter.  J'ai mis € after suffix et 8 maxi, sauf qu'il rempli les vides avec des €... C'est la misère, je sens que je vais coder le formatter... Mais pas ce soir.  :p :p :p
  • psychoh13psychoh13 Mothership Developer Membre
    09:04 modifié #9
    Rassure-moi, tu n'as pas créé plusieurs classes pour le format majuscule au début et pour le format tout en majuscule n'est-ce pas ?
  • chaps31chaps31 Membre
    09:04 modifié #10
    Bon ben je laisse tomber le NSNumberFormatter pas de doc dessus, et impossible d'obtenir ce que je veux juste un simple :

    48.80 €
    -456.20 €

    C'est fou mais pour un néophyte c'est vraiment pas facile à  manier, mieux vaut laisser IB pour les formatter et recoder dans XCode...  :-\\
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #11
    Style sur none

    nombre de décimales : [minimum fraction digit = 2 , maximum fraction digit = 2]
    Nombre de chiffres avant la virgule : [minimum integer digit = 1  
    ajouter € directement dans le format
    code :   #0.00 €
  • chaps31chaps31 Membre
    09:04 modifié #12
    Pour une raison que j'ignore ça ne marche pas.. D'ailleurs j'ai copié des exemples de mon bouquin et ça ne marche pas !! Vraiment dingue, mais j'ai contourné la difficulté

    Lorsque la fenêtre s'ouvre les NSTextfield sont remplis (via un setStringValue) j'ajoute un
    stringWithFormat:@&quot;%@ €&quot;,maVar
    
    et hop ça marche.

    Et pour les textfield avec % qui sont modifiable, hop la méthode delegate
    - (void)controlTextDidChange:(NSNotification *)aNotification
    
    qui rajoute systématiquement % à  la valeur du contenu récupéré via un intValue pour ne pas avoir plusieurs "%".  :P

    Une pirouette pour éviter ces maudit NSFormatter, merci Philippe49 pour ton aide. 
  • psychoh13psychoh13 Mothership Developer Membre
    09:04 modifié #13
    C'est super moche... Presque je te dirais de supprimer ton text field et d'en créer un nouveau en ajoutant le NSNumberFormatter correctement... Parce que là  ça devient grave. o_O
  • chaps31chaps31 Membre
    09:04 modifié #14
    Oui mais ça marche super bien  ;D  Tandis que le NSNumberFormatter  B)
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #15
    ci-joint un nib à  ouvrir avec IB, faire Run dans IB et essayer ...

    Si cela s'emberlificote avec tes delegate method , tu peux aussi utiliser
    float value=[textField floatValue];
    NSString * formatedString=[NSString stringWithFormat:@%.2f €,value];
    [textField setStringValue: formatedString];
    // ....
  • chaps31chaps31 Membre
    09:04 modifié #16
    Il marche très bien ton xib, je vais essayer, j'ai tester sur un textfield d'une tableview mais lui dès que je lui met un NSNumberFormatter il ne m'affiche plus rien... Il ne prend pas la valeur que je lui envoie dans XCode, il reste blanc, alors que sans formatter la valeur s'affiche..  :'(

    Faut que je vire le delegate pour les autres textfield, je teste.
  • chaps31chaps31 Membre
    09:04 modifié #17
    Merci ça marche très bien... Y'a des trucs qui m'échappent... Par contre dans le textField de ma NStableView, une idée ?  Dès que je lie à  un formatter paf, plus rien dans la case...
  • Philippe49Philippe49 Membre
    09:04 modifié #18
    dans 1230919793:

    Merci ça marche très bien... Y'a des trucs qui m'échappent...

    On met en route un certain nombre d'automatismes, et souvent il n'est pas facile de voir dans quel ordre ils s'exécutent, ni la portée de l'intervention de notre code.

    dans 1230919793:

    Par contre dans le textField de ma NStableView, une idée ?  Dès que je lie à  un formatter paf, plus rien dans la case...

    ta table view est gérée en data source ?
  • chaps31chaps31 Membre
    09:04 modifié #19
    oui en datasource
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #20
    Il faut mettre des NSNumber dans le data source et non des NSString

    -(void) awakeFromNib {
    datasource=[[NSMutableArray alloc]initWithObjects:
    [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1],@Col1,@11,@Col2,nil],
    [NSDictionary dictionaryWithObjectsAndKeys:@2,@Col1,[NSNumber numberWithInt:22],@Col2,nil],
    nil
    ];
    }


    ci-dessous, NSNumberFormatter sur les cellules de format #00000 et #000 
  • chaps31chaps31 Membre
    janvier 2009 modifié #21
      Merci Philippe49, en quelques lignes lorsque l'OID de ma valeur retournée par ma base SQL est un nombre je crée un NSNumber et ça marche !!! Génial   :adios!:
    Encore merci  :p

    Bon par contre dans le nsnumberformatter si dans la forme du nombre négatif je ne met pas le "-" il ne le met pas... Pourtant en bas dans la liste des réglages du formatter il est bien précisé (valeur par défaut) que pour les négatif le prefixe est "-"...
    Bon j'ai rajouté "-" dans le format négatif et ça marche mais ça me perturbe que cela ne soit pas automatique lorsque dans les réglages du formatter le prefixe "-" est inscrit en prefixe négatif... Une explication ?

    EDIT : pour mettre le négatif en rouge je passe par la présentation 10.0 du formatter qui à  la case à  cocher "Negative in Red", il y a un moyen de le préciser dans la présentation 10.4+ ?
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #22
    dans 1230973290:

    pour mettre le négatif en rouge je passe par la présentation 10.0 du formatter qui à  la case à  cocher "Negative in Red", il y a un moyen de le préciser dans la présentation 10.4+ ?

    Je ne vois pas dans IB
    D'après la doc sur NSNumberFormatter, on peut coder dans un awakeFromNib du dataSource,
    NSNumberFormatter *numberFormatter =  //récupération dans les text field cells
    NSMutableDictionary *newAttrs = [NSMutableDictionary dictionary];
    [newAttrs setObject:[NSColor redColor] forKey:@NSColor];
    [numberFormatter setTextAttributesForNegativeValues:newAttrs];


  • chaps31chaps31 Membre
    09:04 modifié #23
    Bon ceci dit il suffit de cocher la case dans la "version" 10.0 mais apple devrait faire quelque chose c'est pas très ergonomique...

    Sinon encore merci Philippe49 tu as mis le doigt pile sur mon problème, les données sont rapatriées d'une base PostgreSQL, et en fait elles arrivent toutes au final en NSString, d'où les comportements anarchiques de NSNUMBER, après modification du code pour que les numeric et autres integer restent des nombres les NSnumberFormatter, formattent... Merci encore  o:)

    PS : Tu aimes le Jurançon ? Faut que je pense à  t'en mailer une bouteille  ;)
  • Philippe49Philippe49 Membre
    09:04 modifié #24
    dans 1230983275:

    PS : Tu aimes le Jurançon ? Faut que je pense à  t'en mailer une bouteille  ;)


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