[Résolu] Problème au chapitre 5 du livre Cocoa par la pratique.

DCDDCD Membre
novembre 2006 modifié dans API AppKit #1
Bonjour,

J'ai un problème concernant un exemple du livre "Cocoa par la pratique", au chapitre 5 pour être plus précis (pour ceux ayant ce livre).

Le but de l'application est de gérer du personnel et les augmentations de salaire.

Pour cela on crée uns classe toute simple nomé Person, composée de deux variables d'instances : expectedRaise (de type float) et personName (de type NSString).
Les accesseurs en lecture/écriture sont définies.

#import &lt;Foundation/Foundation.h&gt;<br /><br />@interface Person : NSObject {<br />&nbsp; &nbsp; NSString *personName;<br />&nbsp; &nbsp; float expectedRaise;<br />}<br /><br />- (NSString *)personName;<br />- (void)setPersonName:(NSString *)s;<br />- (float)expectedRaise;<br />- (void)setExpectedRaise:(float)f;<br /><br />@end


L'application est de type NSDocument, dans une fenêtre est affiché une NSTableView et 2 Boutons.

La NSTableView contient 2 colonnes, la première affiche le nom de la personne, et la seconde un numérique (auquel est appliqué un "formatter" de type pourcentage).

Les 2 boutons ont pour but repectifs d'ajouter et de supprimer un enregistrement.

Les outlets sont corrects, et la dataSource est bien définies dans IB.

Le problème se situe au niveau de la cellule qui doit contenir le montant de l'augmentation de salaire.

A chaque fois que je saisie une valeur, celle-ci se met automatiquement à  zéro.

Cela depuis 2 jours que j'essaye de comprendre "l'incompréhensible" (si je puis dire ainsi).

Pourtant les 3 méthodes nécessaires au dataSource sont correctement implémentées :

<br />- (int)numberOfRowsInTableView:(NSTableView *)aTableView<br />{<br />&nbsp; &nbsp; return [employees count];<br />}<br /><br />- (id)tableView:(NSTableView *)aTableView<br />objectValueForTableColumn:(NSTableColumn *)aTableColumn<br />row:(int)rowIndex<br />{<br />&nbsp; &nbsp; NSString *identifier = [aTableColumn identifier];<br /> <br />&nbsp; &nbsp; Person *person = [employees objectAtIndex:rowIndex];<br /><br />&nbsp; &nbsp; return [person valueForKey:identifier];<br />}<br /><br />- (void)tableView:(NSTableView *)aTableView<br />setObjectValue:(id)anObject<br />forTableColumn:(NSTableColumn *)aTableColumn<br />row:(int)rowIndex<br />{<br />&nbsp; &nbsp; NSString *identifier = [aTableColumn identifier];<br /><br />&nbsp; &nbsp; Person *person = [employees objectAtIndex:rowIndex];<br />&nbsp; <br />&nbsp;  [person takeValue:anObject forKey:identifier];<br />}<br /><br />


Par contre, si je fais la modification suivante dans la dernière méthodes citée au dessus, comme ceci :

- (void)tableView:(NSTableView *)aTableView<br />setObjectValue:(id)anObject<br />forTableColumn:(NSTableColumn *)aTableColumn<br />row:(int)rowIndex<br />{<br />&nbsp; &nbsp; NSString *identifier = [aTableColumn identifier];<br />&nbsp; &nbsp; Person *person = [employees objectAtIndex:rowIndex];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if ( [identifier isEqual: @&quot;expectedRaise&quot;] )<br />&nbsp; &nbsp; &nbsp; &nbsp; [person setExpectedRaise: [anObject floatValue]];<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; [person takeValue:anObject forKey:identifier];<br />}<br /><br />


alors ça marche


Donc, je ne sais pas si c'est le fait d'utiliser le "codage à  partir de valeurs clés" qui en soit responsable.

J'en conclus donc que utiliser [person takeValue:anObject forKey:identifier]
pose problème lorsque le champ n'est pas un objet (ici expectedRaise est de type float), car sur le nom de la personne (qui est un NSString) il n'y a pas de problèmes.

Aussi, j'ai pensé que le problème pouvait venir du formatter appliqué, mais malheureusement il n'en est rien car même en l'enlevant cela ne change pas.

Mais bon, comme je suis débutant, j'ai peu être loupé quelque chose, mais cela reste quand même bizarre que même l'exemple téléchargé du site ne marche même pas.

Je vous ai laissé ci-joint l'exemple du bouquin au format zip.

:why?:

Réponses

  • tabliertablier Membre
    00:35 modifié #2
    Je ne sais pas si le problème se situe là , mais la doc indique:

    takeValue:forKey:
    Sets the value for the property identified by key to value. (Deprecated in Mac OS X v10.3. Use setValue:forKey: instead.)

    - (void)takeValue:(id)value forKey:(NSString *)key

    Availability
    Deprecated in Mac OS X v10.3.


    et le bouquin en question date probablement d'avant Mac OS X v10.3.
  • DCDDCD Membre
    00:35 modifié #3
    Je suis vraiment un gros  :)beta:

    La documentation
    , mais bien évidemment.  >:)


    Il suffisait juste d'ouvrir appKiDo et de taper "takeValue" dans le champ de recherche, pour voir tout simplement que cette setValue est plus approprié.

    Merci beaucoup pour ta contribution.

    J'ai changé takeValue:forKey: en setValue:forKey et hop ça marche impeccable.

    Ouf, je vais pouvoir passé au chapitre suivant.

    A propos, sur la couverture du bouquin est inscrit "MacOsX v10.2".

    Savez-vous à  tout hasard s'il y existe une page où sont recensées les méthodes dites "depracated" pour une certaine version du SDK (par exemple lorsque l'on est sur Tiger).

    Encore merci. 


  • WIMPWIMP Membre
    00:35 modifié #4
    Je connais bien Cocoa par la pratique pour en avoir fait tous les exercices quand j'ai débuté sur Cocoa. Mon évaluation est que son principal intérêt est d'être en français. On y apprend beaucoup de choses utiles, mais je trouve qu'il manque cruellement d'esprit de synthèse et de sens pédagogique, en se contentant de parachuter des recettes sans les justifier ni les situer dans le contexte de l'architecture Cocoa.

    Personnellement les deux bouquins qui me sont les plus utiles sont:
    -Buiding Cocoa Applications, de S.Garfinkel et M.K. Mahoney
    -Cocoa in a nutchell, a desktop quick reference de Michael Beam
    Tous deux sont édités par O'Reilly et ont le label "Developer Connection recommended Title"

    Buiding Cocoa Applications ne se contente pas de donner le code mais explique le pourquoi, les solutions alternatives, leurs inconvénients et avantages respectifs.

    Cocoa in a nutchell est bien pratique pour retrouver rapidement les fonctions, methodes, constantes etc.. disponibles, et débute par une descriptions de l'architecture Cocoa et des principales classes assortie d'exemples tres courts.

    Bon courage
  • DCDDCD Membre
    00:35 modifié #5
    Exactement, j'ai surtout acheté ce livre car il est en français. Au début, j'hésitais avec "Programming in Cocoa for MacOsX" ( http://www.objective-cocoa.org/forum/index.php?topic=1967.0 ).

    C'est un bon début pour se familiariser, car ce n'est pas évident lorsque l'on vient du monde des PC, et que l'on est habitué à  des langages un peu plus "conventionnels" (à  part Apple et GNU-Step sous linux qui utilise Objective-C ?) comme C++ (rien que d'y penser ça me donne la migraine ce langage), Java ou Pascal par exemple.

    C'est comme l'HIM de OsX, au début c'est un peu déroutant, mais après quel régal (qu'est-ce que j'aime bien cette unique barre de menu en haut).

    De toute façon, après avoir terminé ce livre j'envisage d'acheter un autre mais en anglais, une fois que j'aurai correctement maitriser les bases du langage et les classes les plus  utilisées du Framework.

    Et merci pour à  toi WIMP pour les références des livres cités, je vais jeter un oeil sur le web.
  • DCDDCD Membre
    00:35 modifié #6
    dans 1162403234:

    ...
    Savez-vous à  tout hasard s'il y existe une page où sont recensées les méthodes dites "depracated" pour une certaine version du SDK (par exemple lorsque l'on est sur Tiger).
    ...



    Arghhhh.... Je viens de me rendre compte qu'il y'a une rubrique intitulé "Appendix A: Deprecated NSTableView methods"  >:)

    Je sens que la doc ma bien me servir.
Connectez-vous ou Inscrivez-vous pour répondre.