[Cocoa] sous classe de NSNumberFormatter

re salut ;)

d'abord merci pour le lien, je m'embetterai moins la prochaine fois :up: j'ai quand même gardé mon code, on doit faire tout nous même pour notre projet...

en fait j'ai un peu avancé, et là je cherche comment bloquer le nombre de caractères dans un champs NSTextView, apparement on peut pas lui coller un NSFormatter (dont je me sert pour des NSTextFields). je ne sais pas trop comment faire :'(
 
re salut ;)

d'abord merci pour le lien, je m'embetterai moins la prochaine fois :up: j'ai quand même gardé mon code, on doit faire tout nous même pour notre projet...

en fait j'ai un peu avancé, et là je cherche comment bloquer le nombre de caractères dans un champs NSTextView, apparement on peut pas lui coller un NSFormatter (dont je me sert pour des NSTextFields). je ne sais pas trop comment faire :'(

l'une des solutions serait de sous-classer ton NSTextView pour intégrer cette notion de limitation de taille.

Sinon a chaque changement de valeur de ton textview, tu vérifie la taille de ta chaîne et tu fais le traitement limitatif, cela t'évite de sous-classer. Mais c'est sans doute la méthode la moins propre je pense.
 
Salut ;)

Alors j'ai regardé un peu comment sous classer NSTextView, mais je ne trouve pas vraiment de méthode équivalente à isPartialStringValid qui me permettait de compter les caractères, mais je vais regarder ça plus en détail.

Sinon j'avais une autre question, à propos des bindings, j'ai réussi à faire des trucs sympas assez rapidement avec, mais je bloque sur un truc un peu plus compliqué :

j'aimerai activer un champs seulement lorsque l'utilisateur a tappé dans un autre, mais je n'y arrive pas du tout avec "l'inspecteur", comment faire ? :zen:
 
Salut ;)

Alors j'ai regardé un peu comment sous classer NSTextView, mais je ne trouve pas vraiment de méthode équivalente à isPartialStringValid qui me permettait de compter les caractères, mais je vais regarder ça plus en détail.

Sinon j'avais une autre question, à propos des bindings, j'ai réussi à faire des trucs sympas assez rapidement avec, mais je bloque sur un truc un peu plus compliqué :

j'aimerai activer un champs seulement lorsque l'utilisateur a tappé dans un autre, mais je n'y arrive pas du tout avec "l'inspecteur", comment faire ? :zen:

On va sûrement me reprendre, mais le binding ne semble pas du tout approprié pour ta dernière demande.
Je rajouterait plutôt le controllerApp en client d'une notification du champs text qui t'intéresse. et dans la méthode de réception de la notification tu testes la nouvelle valeur et en fonction du résultat tu actives-désactives ton champs.

voici un lien vers un tuto sur les notifications : http://www.projectomega.org/article.php?lg=fr&php=tuts_objc5&p=1
 
salut :)

finalement j'ai laissé tombé pour l'activation des champs, ça me paraissait trop compliqué, et en même temps, je me suis apperçu de quelquechose :

J'ai un bouton radio qui me sert à activer/désactiver des champs grâce aux bindings. Ces champs sont associés a ma classe Ip qui descend d'un NSNumberFormatter. Et bien figurez vous que le maximum de 255 n'est plus pris en compte sur les champs bindés !

Ceux qui n'ont aucun bindings envoient un beep lorsque je rentre par exemple 257 et que j'appuie sur la touche tab, ceux qui sont bindés prennent 257 sans se poser de question, pourtant les autres méthodes de ma classe Ip sont prises en compte...

quelqu'un aurait il une idée ??
 
Pour l'interdiction "à la volée", je me dis que d'overrider keyDown fera la job. Juste à capturer la clé pressée et vérifier si le caractère correspond à ce que tu veux...

- (void)keyDown:(NSEvent *)zeEvent
{
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[[zeEvent characters] characterAtIndex:0]])
[super keyDown:zeEvent];
else
NSBeep();
}

Ça règle le problème des caractères non-numériques, mais pas le reste. Mais cette ligne pourrait aussi être intégrée facilement à isPartialString...
 
Salut ;)

-> Trax : merci, mais en fait le problème de l'interdiction à la volée est déjà réglé ! J'ai effectivement créé ma classe avec la méthode isPartialStringValid et ça marche très bien.


En fait actuellement j'essaie d'inclure une progress bar qui avancerait toutes les 2 secondes de 0 à 100. Je n'arrive ABSOLUMENT pas à la faire avancer, et pourtant j'ai regardé je ne sais combien de tutos sur le net, donc un truc doit vraiment m'échapper...
Si quelqu'un pouvait m'aider ça serait top !
:love:
 
Salut ;)

-> Trax : merci, mais en fait le problème de l'interdiction à la volée est déjà réglé ! J'ai effectivement créé ma classe avec la méthode isPartialStringValid et ça marche très bien.


En fait actuellement j'essaie d'inclure une progress bar qui avancerait toutes les 2 secondes de 0 à 100. Je n'arrive ABSOLUMENT pas à la faire avancer, et pourtant j'ai regardé je ne sais combien de tutos sur le net, donc un truc doit vraiment m'échapper...
Si quelqu'un pouvait m'aider ça serait top !
:love:

il te faut faire un NSTimer, mettre ton controller ou ta classe en deleguer du Timer pour sa notification de mise à jour. Il te reste ensuite a implémenter la méthode de mise à jour de ton progresssbar.

Je te posterait si tu veux un exemple plus tard.
 
Je pense que le mot-clé important est : display...
Si tu reste coincé dans une méthode (probablement une boucle assez longue), tu peux forcer le contrôle à se redessiner immédiatement...

...
[barreProgres incrementBy:2.0];
[barreProgres display];
...
 
Salut ;)

ben effectivement ya pas moyen de la faire bouger donc je dois reellement avoir un problème, je vous file mon code parceque là :eek:

j'ai réussi a faire bouger un level indicator de la même façon...

sleep=sleep+2;
[TRANSMISSION_progressBar setMaxValue:sleep];
[TRANSMISSION_progressBar setIndeterminate:YES];
[TRANSMISSION_progressBar setUsesThreadedAnimation:YES];
int cpt=0;
for(cpt; cpt<=sleep;cpt++)
{
system("sleep 1");
[TRANSMISSION_progressBar setIntValue:cpt];
[TRANSMISSION_progressBar displayIfNeeded];
}


je comprend pas trop :eek:
 
  • J’aime
Réactions: p4bl0
Hmm, bon, pour ce qui est de display vs displayIfNeeded, j'ai fait un test et il n'y a pas de diff&#233;rence. Le probl&#232;me, c'est que tu met ta barre en indeterminate :

[TRANSMISSION_progressBar setIndeterminate:YES];

Met "NO" &#224; la place...

En mettant "YES", c'est suppos&#233; te donner le poteau de barbier (qui peut &#234;tre anim&#233; lui aussi, mais il ne "progresse" pas, il fait juste tourner &#224; l'infini)...
 
Salut ;)

Merci pour ta réponse, ça a effectivement résolu le problème :up:

Maintenant j'en ai un autre :love:

En fait la progress bar devrait refléter l'avancement de la transmission de données de notre programme mais il y a un léger problème : dans le code, je lance la progress bar et je lance ma transmission de données l'une après l'autre. Evidemment, l'un se lance une fois que l'autre a terminé. Il faudrait que les deux se lancent en parallèle mais je n'ai absolument aucune idée de comment réaliser cela, je pense qu'il faudrait surement utiliser des threads mais voilà comme vous l'aurez remarqué mon niveau de cocoa est euh :rolleyes:

NSTask ? NSThread ? J'ai commencé a chercher mais sur la méthode pour implémenter ça en parallèle...
 
Salut, finalement on s'est débrouillé autrement, un progressbar indeterminate qu'on arrete à la fin du shell script qui nous bloque, ça marche très bien comme ça !