Aide à  la résolution du premier exercice de "Programmation Cocoa sous Mac Os X"

id0ud0uid0ud0u Membre
04:56 modifié dans API AppKit #1
Je débute dans la programmation sous Cocoa et je cherche de l'aide pour résoudre l'exercice du chapitre 5 du livre qui consiste à  créer une application qui compte le nombre de caractères présents dans une phrase quelconque.
Je pense qu'au niveau d'Interface Builder il n'y a pas de soucis.
Dans le .h : je déclare de IBOutlet NSTextfield (est-cela qu'il faut-faire?)
Mais mon problème réside plutôt dans le fait que je ne sais pas quelle action utiliser ni quoi mettre dans le .m...
C'est assez laborieux je sais, mais si quelqu'un pouvait m'apporter son aide ce serait gentil  :)
Merci par avance..

Réponses

  • 04:56 modifié #2
    Apparemment c'est le dernier bouquin en date dont tu parles ? Donc je ne connais pas les nouveaux exercices.. Par contre de ce que je comprend (Comment ça c'est pas dur à  comprendre ?  :adios!: ), tu dois simplement compter le nombre de caractères que l'utilisateur entre dans un TextField ?

    Si c'est le cas, il suffit simplement de relier (via Interface Builder) ton textField VERS ta classe instanciée (cube bleu) et de choisir "Delegate".

    Dans le .m tu rajoutes la notification
    <br />- (void)controlTextDidChange:(NSNotification*)aNotification<br />{<br />&nbsp; &nbsp; <br />}<br />
    


    Ce petit bout de code sera appelé à  chaque fois qu'une modification a lieu à  l'intérieur de ton TextField.

    Tu rajoutes un simple
    <br />NSLog(@&quot;%i&quot;, [[myTextField stringValue] length]);<br />
    


    Et normalement, le tour est joué.


    Autrement, si ce textField te sert à  afficher directement le nombre de caractères tapés, et que tu as à  côté un NSTextView, tu procèdes de la même manière sauf que le NSTextView sera delegate à  la place du TextField, et au lieu du NSLog tu feras [myTextField setIntValue:myTextView string] length;

  • id0ud0uid0ud0u Membre
    04:56 modifié #3
    Je viens d'essayer cela ne fonctionne pas.. mais c'est peut-être /certainement  :P de ma faute
    Dans l'énoncé le livre dit qu'on doit créer un contrôleur avec deux outlets et une action.
    Le livre précise aussi les méthodes suivantes :
    - (NSString *)stringValue
    - (void)setStringValue:(NSString *)aString

    - (int)length
    + (NSString *)stringWithFormat:(NSString *),...
  • Philippe49Philippe49 Membre
    avril 2009 modifié #4
    Pour comprendre les 4 méthodes qu'on te propose : Tu vas dans le menu Help et tu prends l'option Documentation.

    Tu tapes par exemple length dans le menu search et tu règles comme indiqué par l'image jointe.
    En choisissant length de NSString (comme sur l'image) tu as en dessous la description de ce que cela fait.
  • laudemalaudema Membre
    04:56 modifié #5
    dans 1240951875:


    Je pense qu'au niveau d'Interface Builder il n'y a pas de soucis.
    Dans le .h : je déclare de IBOutlet NSTextfield (est-cela qu'il faut-faire?)
    Mais mon problème réside plutôt dans le fait que je ne sais pas quelle action utiliser ni quoi mettre dans le .m...

    Merci par avance..

    Il faut aussi l'IBAction du bouton qui va déclencher la méthode qui va bien dans le .h et sera écrite dans le .m
    (IBAction)laMethodeQuiVaBien:(id)sender et la relier au bouton dans IB.
    Si c'est fait alors un clic sur le bouton lancera la méthode du .m.
    Et si je regarde l'exemple il y a 2 textfields : un pour entrer du texte et un pour afficher ton résultat. Tu dois aussi les déclarer dans .h pour pouvoir les manipuler dans .m.
    Dans ta méthode tu connais la valeur de textfield1 via stringValue et tu affiches ton résultat dans textField2 via setStringValue.

    Est ce plus clair  ?
  • id0ud0uid0ud0u Membre
    avril 2009 modifié #6
    Merci pour tes explications. Oui ça devient un peu plus clair. Dans le .h j'avais déjà  déclaré les deux textFields mais je ne l'avais pas précisé dans mon post.
    Quant à  l'action je sais qu'il faut la déclarer dans le .h mais j'hésite sur celle à  utiliser : est-ce :
    - (void)setStringValue:(id)sender ?
    Ou bien quelque chose dans le style :
    - (IBAction)LeTrucQuiVaBien:(id)sender avec le bon terme à  la place de "LeTrucQuiVaBien" mais quoi...
  • laudemalaudema Membre
    04:56 modifié #7
    dans 1241030638:

    - (IBAction)LeTrucQuiVaBien:(id)sender avec le bon terme à  la place de "LeTrucQuiVaBien" mais quoi...

    Au temps pour moi, j'aurais dû écrire :
    - (IBAction)laMethodeQueTuVasEcrireToiMeme:(id)sender ça aurait été beaucoup plus clair ;)

    Si tu as le livre la première partie du chapitre c'est justement ça: tu crées une IBAction (sayIt, stopIt) associée à  un bouton de ton interface. Tu refais juste pareil. Pas  besoin de passer les valeurs de tes textfields, tu les interrogeras (ou mettras à  jour) depuis ta méthode.

    Le tout c'est d'imaginer ton objet appController qui a ses propriétés ( elles même des objets le plus souvent ou des actions qui lui sont propres ou vont masquer celles d'un autre objet parent). Ton interface a d'autres objets, tu relies tout ça dans IB via ton .h et ses outlets et tu n'as "plus qu'à " coder les propriétés et actions dans ton .m.
  • id0ud0uid0ud0u Membre
    avril 2009 modifié #8
    J'avance gentiment mais sûrement.
    Mon problème actuel est l'affichage de la phrase " ' ' contient n caractères"...
  • laudemalaudema Membre
    04:56 modifié #9
    dans 1241109495:

    J'appelle mon action comme je veux ou je dois lui donner un nom bien précis ?

    Le nom que tu veux du moment que tu mets les : à  chaque paramètre (si tu mets des paramètres) avec un code de retour comme dans le C. Il n'y a rien de bien différent de ce que j'ai compris du C. - (typeRetour)maMethode:(typeArgument)monArgument1. Souvent les arguments sont des objets, donc des instances de Classe et tu types ta fonction avec un pointeur dépointé -(MaClasseRetour *)maMethode:(maClasseArgument *)monArgument.
    Aussi tout est objet (sauf les int, double, char* et autres types du C qui n'en sont pas si j'ai bien compris) et peut être typé en id : (id)MaMethode:(id)monArgument

    dans 1241109495:

    je pense que j'arrive à  peu près pour le début du code dans le .m mais alors pour ce qui est de remplacer le Label j'ai du mal...

    Reprends les exemples du livre (chapitre 2 p20) et adapte les à  ton cas mais je crains que tu ne te compliques l'existence là  où il ne faut pas. Essayes avec une méthode -(IBAction)pourVoir:(id)sender {NSLog(@sender est: %@", sender);} et tu la relies avec un bouton dans IB. Tu dois voir dans ta console sender est ... (je sais plus un NSButton je crois avec son adresse 0x123).
    Si ça marche brode là  dessus, regarde la valeur de ton textfield en mettant [textfield stringValue] à  la place de sender dans le NSLog..
  • id0ud0uid0ud0u Membre
    04:56 modifié #10
    Je touche à  la fin  :P Mais encore une question :
    comment obtenir le nombre de caractères de la phrase saisie ?
  • laudemalaudema Membre
    04:56 modifié #11
    dans 1241113613:

    Je touche à  la fin  :P Mais encore une question :
    comment obtenir le nombre de caractères de la phrase saisie ?

    Pense objet !
    Oh objet string quelle est ta longueur ?
    [laString length] et c'est le bonheur ?

    [textFieldReponse setStringValue:[NSString stringWithFormat:@longueur %@ caractères",[textFieldEntree length]]]; //tapé dans le navigateur s'il y a des erreurs..
    Mais c'est pas de jeu tu devras faire d'autres exercices tout seul ;-)
  • id0ud0uid0ud0u Membre
    04:56 modifié #12
    Oui effectivement  :P mais je ne compte pas m'arrêter en si bon chemin  :)
    merci pour ton aide en tout cas
Connectez-vous ou Inscrivez-vous pour répondre.