IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Questions sur les NSTextField
Options
Slumb
posté 27 Jun 2014, 12:36
Message #1


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Bonjour,

J'ai un NSTextField et j'aimerais savoir si il est possible de ne le limiter uniquement au chiffres ? Par là, j'entends, uniquement autoriser les frappes de claviers sur les chiffres. Il y a bien un TextFieldWithNumberFormatter mais on peut quand même entrée des lettres et autres symboles.

Merci.

Ce message a été modifié par Slumb - 28 Jun 2014, 11:44.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post
schlum
posté 27 Jun 2014, 12:45
Message #2


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Il faut créer sa propre classe implémentant NSFormatter ; NSNumberFormatter n'est pas assez spécialisée pour n’accepter que des chiffres.


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Slumb
posté 27 Jun 2014, 19:12
Message #3


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Ok schlum, est-ce que tu pourrais m'en dire juste un peu plus ?

Merci.

Ce message a été modifié par Slumb - 14 Jul 2014, 10:45.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post
schlum
posté 29 Jun 2014, 22:52
Message #4


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Là comme ça non, ce sont de vieux souvenirs ; il faut à priori regarder la doc de cette interface :
https://developer.apple.com/library/mac/doc.../Reference.html

Les méthodes qui sont importantes pour n’autoriser que certains caractères semblent :
isPartialStringValid:newEditingString:errorDescription:
et éventuellement :
isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:
errorDescription:


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Slumb
posté 30 Jun 2014, 08:36
Message #5


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Ok, j'avais vu du code sur le net concernant ce problème mais je pensais que c'était un peu vieux.

Merci pour ta réponse, je regarde ça ce soir et je reviendrais faire un feedback.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post
schlum
posté 30 Jun 2014, 11:03
Message #6


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Ah ben c’est vieux, c’est sûr, mais dans les vieilles choses, il y en a toujours utilisées ; le C date de 1970.

Après, il y a peut-être une nouvelle méthode moderne plus élégante pour ça, mais je ne la connais pas.


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
pecos
posté 30 Jun 2014, 13:50
Message #7


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 098
Inscrit : 20 Nov 2004
Membre no 27 340



Bonjour,
si j'ai bien compris, ce que tu veux c'est que l'utilisateur ne puisse pas taper autre chose que des chiffres ?

Je ne programme pas pour Mac, mais pour iOS, qui est très proche
Et justement j'ai eu le même problème sous iOS avec l'équivalent de NStextField, qui est UITextField.

Voilà comment je fais pour limiter la frappe à certains caractères, ou même effectuer des remplacement à la volée :

- Dans la classe qui utilise le UITextField j'implemente la méthode de UITextFieldDelegate
Code
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string


Celle ci est invoquée à chaque fois que le texte change dans le UItextField. (quand on tape quelque chose dedans...)

Je m'en sers donc pour invoquer une seconde méthode que j'appelle (par exemple) :
Code
-(void)verifieUiTextField;


Dans cette seconde méthode, je teste simplement le contenu de la chaine présente dans le UITextField, et si un caractère non permis se présente, je l'efface à la volée en remplaçant le texte par le même texte tronqué du caractère interdit.
(la liste des caractères permis est dans un NSArray, bien entendu)

Je n'ai pas le temps, là, de vérifier si le même genre de méthode de delegate existe pour NSTextField, mais si c'est le cas, le problème est assez facile à résoudre.

EDIT :
je viens de vérifier la classe NSTextField, sous réserves que ça se comporte comme l'équivalent Cocoa Touch, il suffirait d'implementer
Code
-(void)textDidChange:(NSNotification *)aNotification

Et d'agir en conséquence.

Ce message a été modifié par pecos - 30 Jun 2014, 13:59.


--------------------
¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤

                     ANTIOPA
                           
¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤
Go to the top of the page
 
+Quote Post
mpergand
posté 1 Jul 2014, 11:18
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Exemple de formatter:

Code
#import <Cocoa/Cocoa.h>


@interface NumberFormatter : NSFormatter {
    

}


@end


Code
#import "NumberFormatter.h"


@implementation NumberFormatter

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error
{
    BOOL ret=TRUE;
    int i,length=[partialString length];
    
    for(i=0;i<length;i++)
        {
        unichar c=[partialString characterAtIndex:i];

        if( (c<'0')||(c>'9') )
            {
            ret=false;
            *newString=nil;
            break;
            }
        }
        
    return ret;
}


- (NSString *)stringForObjectValue:(id)anObject
{
    return anObject;
}

- (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error
{
        *obj=string;
    
    return TRUE;
}


@end


Il faut initialiser le formatter au démarrage:
Code
NumberFormatter* formater=[[NumberFormatter alloc] init];
[text setFormatter:formater];  // text est un outlet sur le TextField
[formater release];


Go to the top of the page
 
+Quote Post
Slumb
posté 14 Jul 2014, 11:30
Message #9


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Bonjour à tous, je réponds avec pas mal de retard.

@pecos :

Oui j'avais vu ce genre de chose justement sur iOS. Pour cette plateforme d'ailleurs, j'aurais peut-être tout simplement limité au clavier numérique (mais cela n'est peut-être pas suffisent ?). Ou alors en plus d'une méthode de traitement.

Concernant le Mac, le problème de la méthode textDidChange: c'est qu'elle prends en paramètre une notification. J'ai essayé de mettre en place ce processus pour qu'une méthode prenne le relais au lancement de la notification mais pour le moment ça coince.


@mpergand :

Je vais essayer, par contre je ne comprends pas (pour l'instant) pourquoi tu initialise ret à false quand ce sont des entiers qui sont entrés.

Merci en tout cas pour toutes ces réponses, j'essaye de mettre ceci en place aujourd'hui.

Ce message a été modifié par Slumb - 14 Jul 2014, 11:32.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post
Jaypee
posté 14 Jul 2014, 18:16
Message #10


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Une réponse sur StackOverflow: http://stackoverflow.com/questions/1216165...y-allow-numbers on fait beeper pour les mauvais caractères.

J-P
Go to the top of the page
 
+Quote Post
schlum
posté 14 Jul 2014, 19:53
Message #11


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Citation (Slumb @ 14 Jul 2014, 12:30) *
Je vais essayer, par contre je ne comprends pas (pour l'instant) pourquoi tu initialise ret à false quand ce sont des entiers qui sont entrés.

Merci en tout cas pour toutes ces réponses, j'essaye de mettre ceci en place aujourd'hui.


Hum, le test "if( (c<'0')||(c>'9') )" est vrai quand c n’est pas un chiffre justement…

Le C est quand même un pré-requis important pour faire de l’Objective-C wink.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Jaypee
posté 14 Jul 2014, 22:05
Message #12


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Petite question de style...

Je trouve que la méthode isPartialStringValid: newEditingString: errorDescription: est pleine de vide... A chaque nouveau caractère on refait les tests inutiles des caractères qui ont précédé. Or s'ils avaient été invalides, on ne serait pas en train d'en tester un de plus... ne pourrait-on pas se limiter à tester le dernier caractère ?

Y'a pas de malice dans ma question, juste une curiosité.

Edit: J'ai trouvé ma réponse... On peut placer le point d'insertion n'importe où dans le champs et remplacer des caractères déjà saisis... smile.gif

J-P

Ce message a été modifié par Jaypee - 14 Jul 2014, 22:22.
Go to the top of the page
 
+Quote Post
schlum
posté 14 Jul 2014, 22:16
Message #13


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Citation (Jaypee @ 14 Jul 2014, 23:05) *
Petite question de style...

Je trouve que la méthode isPartialStringValid: newEditingString: errorDescription: est pleine de vide... A chaque nouveau caractère on refait les tests inutiles des caractères qui ont précédé. Or s'ils avaient été invalides, on ne serait pas en train d'en tester un de plus... ne pourrait-on pas se limiter à tester le dernier caractère ?

Y'a pas de malice dans ma question, juste une curiosité.

J-P


Je ne suis pas sûr que la méthode est appelée plusieurs fois quand on fait un copier coller dans le champ par exemple. Il me semble plus sage de tester tous les caractères (et puis c’est ce que j’appelle de l’optimisation radine là laugh.gif )


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
mpergand
posté 14 Jul 2014, 22:19
Message #14


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 198
Inscrit : 8 Oct 2003
Membre no 10 220



Il peut y avoir plusieurs caractères dans le cas d'un copier-coller ou d'un drag and drop.

Ce message a été modifié par mpergand - 14 Jul 2014, 22:20.
Go to the top of the page
 
+Quote Post
Jaypee
posté 14 Jul 2014, 22:27
Message #15


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Merci de toutes vos précisions.

Mon propos est celui de la facilité de mantenenance du code. On a tous compris l'intention de la méthode, mais pourquoi n'est elle pas plus évidente ? La preuve Slumb a lu la logique à l' envers.

La raison vous l'avez précisée, et je l'ai trouvée en lisant un peu. On peut éditer autrement qu'en ajoutant un caractère à droite.

J-P
Go to the top of the page
 
+Quote Post
schlum
posté 14 Jul 2014, 22:49
Message #16


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Citation (Jaypee @ 14 Jul 2014, 23:27) *
Merci de toutes vos précisions.

Mon propos est celui de la facilité de mantenenance du code. On a tous compris l'intention de la méthode, mais pourquoi n'est elle pas plus évidente ? La preuve Slumb a lu la logique à l' envers.

La raison vous l'avez précisée, et je l'ai trouvée en lisant un peu. On peut éditer autrement qu'en ajoutant un caractère à droite.

J-P


Cette logique qu’il a lue à l’envers est quand même une logique de base ; une telle confusion me semble impensable pour quelqu’un rompu au C ; je pense plutôt à quelques lacunes wink.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
Slumb
posté 14 Jul 2014, 23:38
Message #17


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Merci pour vos participations.

Alors déjà, oui, ma première lecture était à l'envers. Je ne suis pas un as du C mais j'aurais dû le lire sans problème. Je pense que deux choses m'embrouille en ce moment :
1- L'Objective-C me pose quelques problèmes que je n'ai pas vu venir et je suis un peu déconcerté et sans doutes aussi un peu malmené par certains aspects. J'ai du mal pour le moment à les identifier mais j'espère y remédier rapidement (je compte aussi un peu sur votre aide smile.gif ).
2- Comme le souligne Jaypee, je pensais utiliser d'autres moyens pour aboutir à une solution. Notamment le cas iOS cité en début de post qui me parait plus "jolie". Après, en ayant testé le code de mpergand, ça ne me choque pas plus que ça au final mais bon, je manque sans doutes de pratique.

Ce message a été modifié par Slumb - 15 Jul 2014, 20:37.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post
Jaypee
posté 15 Jul 2014, 09:01
Message #18


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Si Objective-C te trouble, tu va pouvoir te faire la main sur Swift, XCode6 beta est dispo au téléchargement...
En Anglais, swift, c'est le martinet, l'oiseau... Encore que ça pourraitt être une punition pour les développeurs pas sages... Personnellement, je suis assez optimiste, et curieux, surtout curieux...

J-P
Go to the top of the page
 
+Quote Post
Slumb
posté 15 Jul 2014, 20:21
Message #19


Macbidouilleur d'argent !
***

Groupe : Membres
Messages : 782
Inscrit : 11 Sep 2005
Membre no 45 692



Ouais je sais mais il est conseillé de bien connaitre Objective-C avant d'attaquer Swift, de plus j'attends qu'il évolue encore un peu.


--------------------
iMac 27" - MBP 15"
PC ASUS Z97 WIFI + Bluetooth - Intel Core i7-4790K CPU 4,00GHz - GeForce 980 GTX ZOTAC 4Go - 16Go RAM - SSD Crucial
Bluetooth Device (Personal Area Network)
Bluetooth Device (RFCOMM Protocol TDI)
Carte réseau Broadcom 802.11ac
Intel Ethernet Connection I218-V
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 29th March 2024 - 01:29