Stocker Dictionnaire ds plist

21:58 modifié dans API AppKit #1
&lt;plist version=&quot;1.0&quot;&gt;<br />&lt;dict&gt;<br />	&lt;key&gt;Louka&lt;/key&gt;<br />	&lt;array&gt;<br />		&lt;string&gt;Expert&lt;/string&gt;<br />		&lt;integer&gt;18000&lt;/integer&gt;<br />	&lt;/array&gt;<br />&lt;/dict&gt;<br />&lt;/plist&gt;<br />

Voilà  ce que le final devrait donner..
Seulement je n'arrive pas à  le construire depuis le Cocoa..
J'ai tenté quelques approches de ce genre :
<br />NSDictionary *newDictionary;<br />	NSMutableDictionary *mutableDico;<br />	NSMutableArray *mutableArray;<br />	NSArray *aArray;<br />	NSArray *otherArray;<br />	fileManage = [NSFileManager defaultManager];<br />	<br />	path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;];<br />	scoresDictionary = [NSDictionary dictionaryWithContentsOfFile:path];<br />	aArray = [[NSArray alloc] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:[NSNumber numberWithInt:score], [levelName stringValue]]];<br />	newDictionary = [NSDictionary dictionaryWithObjectsAndKeys:aArray];<br />	[newDictionary writeToFile:path atomically:NO];<br />


Hum bug à  partir de
<br />aArray = [[NSArray alloc] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:[NSNumber numberWithInt:score], [levelName stringValue]]];<br />


Bref j'ai bcp de mal avec les données moi :s

Réponses

  • fouffouf Membre
    21:58 modifié #2
    Ya une erreure dans ta dernière ligne : il faut mettre
    aArray = [[NSArray alloc] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:[NSNumber numberWithInt:score], [levelName stringValue],nil]];
    


    Mais personellement, je trouve que initWithObjects: est plus approprié. Ca te donne ca :
    aArray = [[NSArray alloc]initWithObjects:[NSNumber numberWithInt:score], [levelName stringValue],nil];
    
  • 21:58 modifié #3
    Hoo punaise je suis con c'est vrai j'avais complétement oublié le nil !
    InitWithObjects ? je  ne pense pas car en fait je veux ajouter à  chaque fois une array contenant ces infos  ;)
    Merci vais voir ça
  • 21:58 modifié #4
    ça marche mais quoi qu'il en soit je n'arrive pas à  obtenir ceci :


    [Fichier joint supprimé par l'administrateur]
  • 21:58 modifié #5
    Grr Bon en cherchant correctement j'ai pu trouver :)
    Merci quand même o:)
  • ClicCoolClicCool Membre
    21:58 modifié #6
    dans 1113075161:

    Hum bug à  partir de
    <br />aArray = [[NSArray alloc] arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:[NSNumber numberWithInt:score], [levelName stringValue]]];<br />
    


    Bref j'ai bcp de mal avec les données moi :s


    Hum,

    Bon, comme l'a justement souligné Eddy arrayWithObjects attends une suite terminée par nil.

    Mais ce qui me gêne le plus dans ce code c'est un Alloc qui n'est pas suivi par un init ou initWith....
    Tu alloues un NSArray et d'emblé lui adresse une méthode de classe sans avoir pris la précaution de l'initialiser ... pas glop.

    La solution d'Eddy est également sur ce point plus propre et viable avec initWithObjects:

    Du reste je comprend pas ta réponse:
    dans 1113125348:
    je  ne pense pas car en fait je veux ajouter à  chaque fois une array contenant ces infos  ;)


    Car en faisant un alloc chaques fois, tu ajoutes rien puisque tu alloue sauvagement un nouvel array vide.

    Si j'ai bien compris ta problématique il te faut alors bel et bien utiliser arrayByAddingObjectsFromArray.
    Mais alors pas besoin de creer un array avec un alloc.
    nouvelArray = [ancienArray arrayByAddingObjectsFromArray: Eau, Pastis, Olive, nil];
    

    Te donne un NSArray tout neuf et autoreleasé.
    Si tu utilisais alloc pour avoir un objet non autoreleasé, il te suffit d'ajoueter retain:
    nouvelArray = [[ancienArray arrayByAddingObjectsFromArray: Eau, Pastis, Olive, nil] retain];
    

    et n'oublies pas de releaser ancienArray si tu a fais un retain dessus ou si tu l'as créé avec un couple alloc/init.



    P.S. et P.J. (Private Joke) oui, je sais j'ai perdu au Mikado, ça nous fait 1 partout  :P
  • Eddy58Eddy58 Membre
    21:58 modifié #7
    dans 1113173369:

    Bon, comme l'a justement souligné Eddy arrayWithObjects attends une suite terminée par nil.

    Mais ce qui me gêne le plus dans ce code c'est un Alloc qui n'est pas suivi par un init ou initWith....
    Tu alloues un NSArray et d'emblé lui adresse une méthode de classe sans avoir pris la précaution de l'initialiser ... pas glop.

    La solution d'Eddy est également sur ce point plus propre et viable avec initWithObjects:

    Non non ClicCool, je n'y suis absolument pour rien dans cette histoire... ;)
    Rendons à  Fouf ce qui est à  Fouf. :fouf): :P
  • ClicCoolClicCool Membre
    21:58 modifié #8
    Oups, en effet  ???

    Je venais de lire une série de tes posts et j'ai fait un lapsus malencontreux.

    C'est bel et bien de Fouf dont je voulais parler et dont les propositions me sembalient frappées du coin du bon sens.
    Quand il rêve pas de machine à   :fouf): 800 Ghz  :fouf):  ;D il dit des chose bien ce Fouf ;)

  • Eddy58Eddy58 Membre
    21:58 modifié #9
    dans 1113174621:

    Je venais de lire une série de tes posts et j'ai fait un lapsus malencontreux.

    Ca serait peut-être bien du au fameux effet EPO non ce genre de lapsus ? :p ;)

    dans 1113174621:

    Quand il rêve pas de machine à Â  :fouf): 800 Ghz  :fouf):  ;D il dit des chose bien ce Fouf ;)

    Là  je pense que c'est l'effet :fouf): :fouf): ;)
  • avril 2005 modifié #10
    J'ai fait un truc simple pour ensuite être stocker ds un NSTableView :
    <br />- (NSDictionary *)createRecord<br />{<br />&nbsp; &nbsp; NSMutableDictionary *record = [[NSMutableDictionary alloc] init];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [record setObject:[playerName stringValue] forKey:@&quot;playerIdent&quot;];<br />	[record setObject:[NSNumber numberWithInt:[totalpts intValue]] forKey:@&quot;scoreIdent&quot;];<br />	[record setObject:[NSNumber numberWithInt:ennemyDefeated] forKey:@&quot;ennemyDefeatedIdent&quot;];<br />	if(level==1){<br />	[record setObject:@&quot;Débutant&quot; forKey:@&quot;levelIdent&quot;];<br />	}<br />	else<br />	if(level==2){<br />	[record setObject:@&quot;Confirmé&quot; forKey:@&quot;levelIdent&quot;];<br />	}<br />	else<br />	if(level==3){<br />	[record setObject:@&quot;Expert&quot; forKey:@&quot;levelIdent&quot;];<br />	}<br />&nbsp; &nbsp; [record autorelease];<br />&nbsp; &nbsp; return record;<br />}<br /><br />- (IBAction)addScore:(id)sender<br />{<br />	[newGameMenu setEnabled:YES];<br />	fileManage = [NSFileManager defaultManager];<br />	<br />	path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;];<br />	if([fileManage fileExistsAtPath:path]==NO){<br />		records = [[NSMutableArray alloc] init];<br />	}<br />	else{<br />		records = [NSMutableArray arrayWithContentsOfFile:path];<br />	}<br />	[records addObject:[self createRecord]];<br />	[records writeToFile:path atomically:NO];<br />    [tableViewScores reloadData];<br />	[addScoreWindow orderOut:nil];<br />	[NSApp endSheet:addScoreWindow returnCode:0];<br />	[scoresWindow makeKeyAndOrderFront:sender];<br />	[winWindow close];<br />}<br />- (int)numberOfRowsInTableView:(NSTableView *)aTableView<br />{<br />	path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;];<br />	records = [NSMutableArray arrayWithContentsOfFile:path];<br />    return [records count];<br />}<br /><br />- (id)tableView:(NSTableView *)aTableView<br />      objectValueForTableColumn:(NSTableColumn *)aTableColumn<br />      row:(int)rowIndex<br />{<br />    id theRecord, theValue;<br />   path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;];<br />	records = [NSMutableArray arrayWithContentsOfFile:path];<br />    theRecord = [records objectAtIndex:rowIndex];<br />    theValue = [theRecord objectForKey:[aTableColumn identifier]];<br />    <br />    return theValue;<br />}<br /><br />- (IBAction)eraseScores:(id)sender<br />{<br />	fileManage = [NSFileManager defaultManager];<br />	 path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;];<br />	[fileManage removeFileAtPath:path handler:nil];<br />	[tableViewScores reloadData];<br />}
    


    :)
    Vlà  ce que ça donne sur le jeu : http://www.eagle-of-liberty.com/prog/jeux/KirbyFight.dmg (beta
  • fouffouf Membre
    21:58 modifié #11
    On m'appelle ??
    ClicCool, quand tu préscris un médic, tu te goures souvent ?  ;)
  • cbrandtcbrandt Membre
    21:58 modifié #12
    je pense que tu devrais éviter de recharger le contenu du fichier à  chaque fois que la tableview a besoin d'afficher quelque chose...

    <br />/**************<br />* ajouté */<br />- (void) awakeFromNib<br />{<br />path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;]; <br />if([fileManage fileExistsAtPath:path]==NO){ <br />records = [[NSMutableArray alloc] init]; <br />}<br />else{ <br />records = [[NSMutableArray arrayWithContentsOfFile:path] retain];  // ne pas oublier un petit retain ici !<br />}<br />}<br />/**************/<br /><br />- (NSDictionary *)createRecord <br />{<br />    NSMutableDictionary *record = [[NSMutableDictionary alloc] init]; <br />    <br />    [record setObject:[playerName stringValue] forKey:@&quot;playerIdent&quot;]; <br />[record setObject:[NSNumber numberWithInt:[totalpts intValue]] forKey:@&quot;scoreIdent&quot;]; <br />[record setObject:[NSNumber numberWithInt:ennemyDefeated] forKey:@&quot;ennemyDefeatedIdent&quot;]; <br />if(level==1){ <br />[record setObject:@&quot;Débutant&quot; forKey:@&quot;levelIdent&quot;]; <br />}<br />else <br />if(level==2){ <br />[record setObject:@&quot;Confirmé&quot; forKey:@&quot;levelIdent&quot;]; <br />}<br />else <br />if(level==3){ <br />[record setObject:@&quot;Expert&quot; forKey:@&quot;levelIdent&quot;]; <br />}<br />    [record autorelease]; <br />    return record; <br />}<br /><br />- (IBAction)addScore:(id)sender <br />{<br />[newGameMenu setEnabled:YES]; <br />fileManage = [NSFileManager defaultManager]; <br />/**************<br />* déplacé vers awakeFromNib *<br />path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;]; <br />if([fileManage fileExistsAtPath:path]==NO){ <br />records = [[NSMutableArray alloc] init]; <br />}<br />else{ <br />records = [NSMutableArray arrayWithContentsOfFile:path]; <br />}<br />*************/<br />[records addObject:[self createRecord]]; <br />[records writeToFile:path atomically:NO]; <br />    [tableViewScores reloadData]; <br />[addScoreWindow orderOut:nil]; <br />[NSApp endSheet:addScoreWindow returnCode:0]; <br />[scoresWindow makeKeyAndOrderFront:sender]; <br />[winWindow close]; <br />}<br />- (int)numberOfRowsInTableView:(NSTableView *)aTableView <br />{<br />/**************<br />* supprimé *<br />path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;]; <br />records = [NSMutableArray arrayWithContentsOfFile:path]; <br />*************/<br />    return [records count]; <br />}<br /><br />- (id)tableView:(NSTableView *)aTableView <br />      objectValueForTableColumn:(NSTableColumn *)aTableColumn <br />      row:(int)rowIndex <br />{<br />    id theRecord, theValue; <br />/**************<br />* supprimé *<br />   path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;]; <br />records = [NSMutableArray arrayWithContentsOfFile:path]; <br />*************/<br />    theRecord = [records objectAtIndex:rowIndex]; <br />    theValue = [theRecord objectForKey:[aTableColumn identifier]]; <br />    <br />    return theValue; <br />}<br /><br />- (IBAction)eraseScores:(id)sender <br />{<br />fileManage = [NSFileManager defaultManager]; <br />path = [NSHomeDirectory() stringByAppendingPathComponent:@&quot;Library/Preferences/KirbyFightScores.plist&quot;]; <br />[fileManage removeFileAtPath:path handler:nil]; <br />/**************<br />* ajouté */<br />[records removeAllObjects];<br />/**************/<br />[tableViewScores reloadData]; <br />}<br />
    
  • 21:58 modifié #13
    huh en effet j'ai complétement zappé le retain ! c'est vachement utile merci
Connectez-vous ou Inscrivez-vous pour répondre.