NSDictionary

gogaulegogaule Membre
18:36 modifié dans API AppKit #1
Bonsoir .
Je voudrais créer un NSDictionary .
J' ai écrit ce code :
NSDictionary *dico=[[NSDictionary alloc ] init];
[dico setObject@"partie1",@partie2,@partie3,@partie4,@partie5,@partie6,@partie7];
NSArray* arrayTvB=[dico allKey];
NSString *theKey=[arrayTvB objectAtIndex:row];
[tableColumnTotal setStringValue:[dico objectForKey:theKey];
(NSDictionary *dicoRelease]

Avec cela si j'ai bien compris vos explications , sur les post anciens que je relis ; je retiens ? les valeurs entrées dans les colonnes , et les ré-adressent  à  la column Total . Oublié "retain" ?
Merci
Cordialement
«13456789

Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    18:36 modifié #2
    Pour commencer, la méthode -setObject: n'est pas définie dans NSDictionary.
    Ensuite, un NSDictionary est non-modifiable, ce qui fait que ton [[NSDictionary alloc] init] te retourne un dictionnaire vide que tu ne pourras pas modifier.
    Et pour finir, un dictionnaire stocke un ensemble de couple de clés/valeurs, à  chaque valeur est associé une clé et on récupère la valeur selon la clé...
    Mais comme, personnellement, je te l'ai dit plusieurs fois, tu peux te contenter d'utiliser une classe de données contenant chacun des champs que tu souhaites...
    ça reste la méthode la plus adaptée, notamment parce que par défaut le dictionnaire n'est pas capable d'additionner une série de champs...

    Sinon, si tu tiens vraiment à  utiliser un dictionnaire, il vaut mieux utiliser un NSMutableDictionary qui permet, comme son nom l'indique, de créer des dictionnaires modifiables.
  • gogaulegogaule Membre
    18:36 modifié #3
    Bonjour.
    Oui ,
    Après réflection ,le post étant déja parti .
    Un NSMutableDictionary , oui .
    Ce que je désirerais surtout c'est l'analyse de mon code ,savoir pourquoi il ne fonctionne pas .Et si je suis sur la bonne voie .Si les phrases sont bonnes .(Pour le code .)Dois-je mettre un retain ? ou .
    J'ai relu tous les post des forums .
    Merci
    Cordialement.
  • gogaulegogaule Membre
    18:36 modifié #4
    Re
    [dico setObject@"partie1",@partie2,@partie3,@partie4,@partie5,@partie6,@partie7];

    Cette ligne demande t-elle bien de retenir les valeurs contenues dans les  colonnes , dois-je spécifié une ligne ?
    NSDictionary *dico=[[NSDictionary alloc ] init];

    Donc NSMutableDictionary *dico=[[NSMutableDictionary alloc] init]; /Je créé le dico .
    Merci a toi
    Cordialement.
  • psychoh13psychoh13 Mothership Developer Membre
    18:36 modifié #5
    NON ! Cette ligne c'est u grand n'importe quoi !
    Primo, une méthode qui prend des paramètres contient un deux-point ":" dans son nom.
    Secondo, il n'existe aucune méthode -setObject: définie dans NSDictionary ou même dans NSMutableDictionary.
    Et tertio, à  fortiori il n'existe pas de méthode -setObject: avec nombre d'arguments variable !

    Ensuite, un message s'écrit comme ça : [receveur message], qu'est-ce que c'est que ça :

    (NSDictionary *dicoRelease]
    

    ?

    Et pour finir, il faudrait que tu aies un NSMutableArray qui stocke plusieurs NSMutableDictionary pour qu'il soit valable !
    Là  ce que tu m'écris c'est du grand n'importe quoi, tu confonds colonnes et rangés...
  • gogaulegogaule Membre
    18:36 modifié #6
    psychoh ,re
    Merci .
    Je vais abandonner la création d' un NSMutableDictionary      Compliqué .
    J' ai recommencé mon appli depuis le début en suivant vos conseil .
    J' ai édité le code MyControleur .h  (5 lignes de code )
    débuguer et créé l'appli , miracle la fenêtre s'ouvre avec les colonnes .
    Le fichier MyControleur .m est écrit cela ce fait automatiquement ?
    Je vais essayer de coder ligne après ligne , si je ne réussi pas , je vous aurai fais perdre votre temps .
    Cordialement.
  • cdorecdore Membre
    18:36 modifié #7
    Salut

    Sans vouloir être méchant, si tu te décourages pour si peu, tu vas pas aller loin!!

    Bon qq conseils, pour encourager ;-)

    1/ la façon basique pour remplir un NSMutableDictionary est utiliser setObject:ForKey: pour chaque paire clé/valeur à  y inserer.

    [dico setObject@"maValeur" forKey:@maClé];


    Pour initialiser directement le contenu, tu peux faire
    dico=[[NSMutableDictionary dictionaryWithObjectsAndKeys:@val1,@key1,@val2,@key2,nil,nil] retain];

    tu peux repeter autant de paires valeur/clé sur la ligne, séparés par des virgules, pourvu que tu finisses toujours par les deux nil. (ce sont les sentinelles de fin d'arguments variables)


  • schlumschlum Membre
    18:36 modifié #8
    Un seul "nil" suffit à  la fin ; inutile d'alourdir  :P
    D'ailleurs, c'est même risqué d'en mettre 2, vu que...

    First the key for firstObject, then a null-terminated list of alternating objects and keys. If any key is nil, an NSInvalidArgumentException is raised.
    


    (heureusement, il est probable qu'il s'arrête au premier et donc qu'il ne trouve pas le second qui enverrait l'exception).
  • gogaulegogaule Membre
    18:36 modifié #9
    Bonjour.
    Oui j'ai recommencé (2 fois ) . Je dois vraiment être un bourricot . Impossible de faire apparaà®tre la ligne bleue.
    La fenêtre s'ouvre les colonnes apparaissent , les deux boutons bleuissent . C' est tout .Pas d'erreurs ou d' alertes
    Les 3 méthodes du NSTableDataSource protocol suffisent - elles ?
    Le MutableArray n' a besoin que d'être déclaré et initialisé avec (id)init .
    Si je suis l'exemple du livre ,chapitre 5 , je plante . dois-je rajouter quelque-chose ?

    Merci
    Cordialement .
  • gogaulegogaule Membre
    18:36 modifié #10
    Re
    Dites je reçois un message d'erreur pour ce code ?
    -(NSDictionary *)createAddition
    {
    NSMutableDictionary* addition = [[NSMutableDictionary alloc] init];
    addition = [[NSMutableDictionary dictionaryWithObjetsAndKey:@Val1,@partie1,@Val2,@partie2,@Val3,@partie3,@Val4,@partie4 nil] retain];
    [addition autorelease];
    return addition;
    }

    /Desktop/Gestionnaire2/addition.m:17: error: parse error before numeric constant

    Sauriez-vous pourquoi ?
    Merci
    Cordialement.
  • psychoh13psychoh13 Mothership Developer Membre
    18:36 modifié #11
    tu n'as pas mis de virgule avant le nil...
  • gogaulegogaule Membre
    18:36 modifié #12
    Psychoh ,
    Merci .
    J'avais trouvé l'erreur en me relisant .
    J'ai une nouvelle erreur :
    return addition ? à  la fin .
    /Desktop/MON2 - copie 1/MyDocument.m:19: error: parse error before 'return'

    Pourquoi ?
    Merci .
    Cordialement.
  • gogaulegogaule Membre
    18:36 modifié #13
    Re
    Bon j'avais oublié , des parenthèses , cela fonctionne .
    Qui m' expliqueras comment récupérer les valeurs pour les additionner et les renvoyer vers Total .
    Merci .
    Cordialement .
    Aucuns post découvert traitant ce sujet .
    Pour le code précédent @ Val1 , @Val2 est suffisant pour qu'il récupère les valeurs inscrites dans la cellule ?
    @partie1,@partie2...?
    Merci.
  • schlumschlum Membre
    18:36 modifié #14
    Ce sont des chaà®nes de caractère ; ça ne récupérera de valeurs nulle part (et ce n'est pas "additionnable").

    La méthode pour récupérer les données d'un tableau dépend de comment sont gérées ces données (binding ArrayController, structure interne au contrôleur dans le code...)
  • gogaulegogaule Membre
    18:36 modifié #15
    Bonjour ,
    Merci .
    J'ai créé un NSMutableDictionary pour retenir les scores des parties .
    Je gére ce tableau (NSTableView ) avec des bindings . Je suis trop bourricot pour trouver autre choses .
    Donc si je te suis bien , par les Values Bindables , je peut les récupérées et les additionnées .                            Mais les scores entrés dans les cellules vont bien à  la place des Val1 Val2 .Ou je nage encore ? Cela est juste une adresse ?
    Merci .
    Cordialement .
  • schlumschlum Membre
    18:36 modifié #16
    Ton code juste au dessus crée un nouveau dictionnaire qui n'a absolument rien à  voir avec tes données.

    Là  avec ton code on ne peut pas deviner comment sont gérées les données. Un dictionnaire n'est pas l'idéal pour gérer les données d'un tableau ; en général on utiliser un NSMutableArray.
  • gogaulegogaule Membre
    18:36 modifié #17
    Re

    Bon d' accord , mais quelles différences . ?
    Pour la récup des données possible avec un NSMutableArray ?
    Pourquoi je ne trouve pas d' exemple d' additions ?
    Merci.
    Cordialement.
  • schlumschlum Membre
    18:36 modifié #18
    Une exemple d'addition avec un NSMutableArray qui contient des dictionnaires :

    NSArray *data = (NSArray*)myMutableData;<br />NSEnumerator *e = [data objectEnumerator];<br />long sum = 0;<br />NSDictionary *currDic;<br />while(currDic=[e nextObject])<br />&nbsp; &nbsp; sum += [[currDic objectForKey:@&quot;score&quot;] longValue];
    

  • AliGatorAliGator Membre, Modérateur
    février 2008 modifié #19
    dans 1202724622:
    -(NSDictionary *)createAddition<br />{<br />	NSMutableDictionary* addition = [[NSMutableDictionary alloc] init];<br />	addition = [[NSMutableDictionary dictionaryWithObjetsAndKey:@&quot;Val1&quot;,@&quot;partie1&quot;,@&quot;Val2&quot;,@&quot;partie2&quot;,@&quot;Val3&quot;,@&quot;partie3&quot;,@&quot;Val4&quot;,@&quot;partie4&quot;,nil] retain];<br />	[addition autorelease];<br />	return addition;<br />	}<br />
    
    Ligne1 : addition = un nouv dico
    Ligne2 : addition = un autre nouv dico, != du premier, et le remplaçant => tu perds la trace du premier pour tjs
    Ligne 3 autorelease envoyé donc au 2e dico alors qu'il était déjà  envooyé par le constr de commodité... du coup tu fais retain pour faire autorel = inutile
    Final = un obj alloué pour rien et en plus jamais releasé, et un couple retain/autorel pr rien + return d'un objet "retained" et non autoreleased, donc contraire à  la règle de base de gestion mémoire (qui retain release)
  • gogaulegogaule Membre
    18:36 modifié #20
    AliGator , bonjour .
    Merci .
    J'ai supprimé la deuxième ligne ?
    Savez-vous pourquoi il apparais (<null>) dans les cellules ?
    Mon Dico ne sert à  rien pour les bindings ?
    J' ai cru comprendre qu' il fallait stocker les données pour pouvoir les exploitées avec les bindings .?
    Cordialement.
  • schlumschlum Membre
    18:36 modifié #21
    Pourquoi ne pas avoir un NSArrayController comme dans le premier projet avec un outlet pointant dessus au niveau du contrôleur ?
    Ensuite récupérer les données avec la méthode "content"
  • gogaulegogaule Membre
    18:36 modifié #22
    Re
    Schlum .
    J' ai un NSArrayController  qui gére mes bindings . Un outlet pointant vers le contrôleur ? File'S Owner ?
    déja fait .
    Je pensais avoir compris qu' un NSDictionary permettais de gérer les bindings .
    Merci
    Cordialement.
  • schlumschlum Membre
    18:36 modifié #23
    Non, vers un contrôleur... Pas File's owner, un vrai contrôleur, comme on en fait dès le début dans les tutoriels de Cocoa par la Pratique !
  • gogaulegogaule Membre
    18:36 modifié #24
    Bonjour.
    Cela ne marche pas . Bon .
    Dit moi j' ai trouvé un code en langage Java , dans le livre les cahiers du programmeurs MOSX .
    Pourrait-il fonctionner après modifications ?
    Ou encore une utopie ?
    Merci .
    Cordialement.
  • schlumschlum Membre
    18:36 modifié #25
    Le Java n'est pas plus simple que l'Objective-C...
  • gogaulegogaule Membre
    18:36 modifié #26
    Bonjour.
    Schlum.
    Merci de consacrer un peu de temps .
    J'ai édité le script dans un dossier Java . Compilé , Ca "passe " sans warning .
    Accepteriez-vous , si vous savez comment faire , de me guider ,pour éditer ce morceau de code et qu'il fonctionne que je puisse enfin tourner la page du tableau .
    Oui je suis de +++ lourd mais ..
    Je ne trouve pas dans ce code la partie qui renvoie le résultat vers une column ou un NSString .
    OUI j'ai essayé de mettre en oeuvre ton exemple sans succès .
    Vous c' est toi et les autres membres du forum  ..
    Merci    d' avance ...
    Cordialement.
    Dans ton exp objectForKey:@Score et la destination du résultat .?
  • schlumschlum Membre
    18:36 modifié #27
    En Java, non... Mais fournis moi un projet avec tes bindings et je vois si je peux ajouter une fonction qui calcule la somme...
  • gogaulegogaule Membre
    18:36 modifié #28
    Re-bonjour .
    Voilà  l' archive de mon projet.

    Merci
    Cordialement.
  • schlumschlum Membre
    18:36 modifié #29
    Quand j'appuie sur "Nouveau Joueur", rien ne se passe, et j'ai un message d'erreur :
    Cannot create number from object (<br />&nbsp; &nbsp; &lt;null&gt;<br />) of class NSCFArray
    


    Il faudrait pouvoir ajouter des joueurs pour pouvoir calculer la somme !
  • gogaulegogaule Membre
    18:36 modifié #30
    Euh !
    Sur mon ordi tout fonctionne ..
    Je peut ajouter un joueur et l'effacer .
    Inscrire des données sur ou dans les lignes ..
    Je peut trier les colonnes en cliquant sur le titre .
    Je ne sais pas ?
    Cordialement .
  • gogaulegogaule Membre
    18:36 modifié #31
    Oui !
    Sur l' archive , il faut cliquer sur la ligne pour la sélectionner et pouvoir rajouter un joueur ou l' effacer ?
    Cordialement
Connectez-vous ou Inscrivez-vous pour répondre.