Problème mise à  jour plist file

Bonjour,



J'ai un soucis concernant la mise à  jour de mon fichier plist.

Plus précisément cette mise à  jour fonctionne sur le simulateur mais pas sur mon device (iPad).



Voici ma méthode permettant de mettre à  jour mon fichier.


<br />
+(void)updateConfigTimerWithString:(NSNumber *) newConfigTimer<br />
{<br />
    // Initialiser des variables pour la lecture du fichier plist.<br />
    NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;settings&quot; ofType:@&quot;plist&quot;];<br />
    if (path &#33;= nil) {<br />
	    NSMutableDictionary *dictForFile = [[NSMutableDictionary alloc] initWithContentsOfFile:path];<br />
	    [dictForFile setObject:newConfigTimer forKey:@&quot;configTimer&quot;];<br />
	    [dictForFile writeToFile:path atomically:YES];<br />
	    NSLog(@&quot;- [SettingsProperty updateConfigTimerWithString:] PlistFile updated with %@&quot;,[[dictForFile objectForKey:@&quot;configTimer&quot;] stringValue]);<br />
	    [dictForFile release];<br />
    }else {<br />
	    NSLog(@&quot;- [SettingsProperty updateConfigTimerWithString:] The plist file settings doesn&#39;t exist.&quot;);<br />
    }<br />
}<br />




Voici le code permettant de récupérer la nouvelle valeur.


<br />
#pragma mark - getConfigTimer -<br />
+(int)getNewConfigTimer<br />
{<br />
    // Initialiser des variables pour la lecture du fichier plist.<br />
    NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;settings&quot; ofType:@&quot;plist&quot;];<br />
    int timer = 0;<br />
    if (path &#33;= nil) {<br />
	    NSMutableDictionary *dictForFile = [[NSMutableDictionary alloc] initWithContentsOfFile:path];<br />
	    timer = [[dictForFile objectForKey:@&quot;configTimer&quot;] intValue];<br />
	    NSLog(@&quot;TIMER : %i&quot;,timer);<br />
	    [dictForFile release];<br />
    }else {<br />
	    NSLog(@&quot;- [SettingsProperty updateConfigTimerWithString:] The plist file settings doesn&#39;t exist.&quot;);<br />
    }<br />
   <br />
    return timer;<br />
}<br />




Avez-vous une idée ?



Merci pour vos retour, car je coince un peu.



K.
Mots clés:

Réponses

  • Tu ne peux pas modifier quelque chose contenue par ton bundle applicatif, c'est du read only sur l'iPhone.



    La bonne méthode pour ce que tu cherche à  faire est d'utiliser NSUserDefault et chargé le contenu de ton plist comme valeur par défaut pour les préférences de l'utilisateurs.



    Concrètement cela va créer un autre fichier plist dans le dossier Library de l'utilisateur pour ton application et de fait permettre l'écriture.
  • ça marche.

    Je regarde ça ce soir !!



    Merci !!



    K.
  • Merci à  toi yoann, c'est 10 fois plus simple à  implémenter.

    Tout fonctionne merci.



    Voici le code pour ceux qui rencontre le problème :


    <br />
    #pragma mark - update plist file -<br />
    +(void)updateConfigTimerWithString:(NSNumber *) newConfigTimer<br />
    {<br />
        NSUserDefaults *settingsUser = [NSUserDefaults standardUserDefaults];<br />
        [settingsUser setObject:newConfigTimer forKey:@&quot;configTimer&quot;];<br />
    }<br />
    



    <br />
    #pragma mark - getConfigTimer -<br />
    +(int)getNewConfigTimer<br />
    {<br />
        NSUserDefaults *settingsUser = [NSUserDefaults standardUserDefaults];<br />
        NSString *timer = [settingsUser stringForKey:@&quot;configTimer&quot;];<br />
       <br />
        return [timer intValue];<br />
    }<br />
    
  • Oula, il y a plein de truc étrange dans ton code...


    <br />
    +(void)updateConfigTimerWithString:(NSNumber *) newConfigTimer<br />
    




    WithString mais tu demande un NSNumber ?


    <br />
    [settingsUser setObject:newConfigTimer forKey:@&quot;configTimer&quot;];<br />
    




    Normalement c'est setValue: forKey:




    <br />
    NSString *timer = [settingsUser stringForKey:@&quot;configTimer&quot;];  <br />
    return [timer intValue];<br />
    




    Et pourquoi ne pas utiliser directement intForKey ?
  • Salut !



    Oui, toutes ses remarques sont judicieuses image/smile.png' class='bbc_emoticon' alt=':)' />



    C'est entièrement ma faute, je n'ai pas revu mon code avant de poster.

    Mais dans mon appli c'est écrit correctement.



    Désolé ...



    Je fais toujours 2 étapes :
    • 1 - Code qui marche
    • 2 - Code propre.


    J'en étais à  l'étape 1, lors du post.



    Voici mon code propre :


    <br />
    #pragma mark - update plist file -<br />
    +(void)updateConfigTimerWithNumber:(NSNumber *) newConfigTimer<br />
    {<br />
        NSUserDefaults *settingsUser = [NSUserDefaults standardUserDefaults];<br />
        [settingsUser setValue:newConfigTimer forKey:@&quot;configTimer&quot;];<br />
    }<br />
    #pragma mark - getConfigTimer -<br />
    +(int)getNewConfigTimer<br />
    {<br />
        NSUserDefaults *settingsUser = [NSUserDefaults standardUserDefaults];<br />
        return [settingsUser integerForKey:@&quot;configTimer&quot;];<br />
    }<br />
    




    K.
  • Mieux en effet. Dernière chose, le getter et le setter sont censé être du même type pour que ce soit cohérent. Ici tu donne un NSNumber et tu reçoit un NSInteger, c'est pas logique...



    Concernant la convention de nommage, en ObjC on ferait plus setConfigTimerWith... et configTimer.



    C'est mieux de se conformer aux habitudes du milieu si quelqu'un doit reprendre ton code un jour.
  • Merci pour tes remarques, elles sont appliqués dans mon code depuis hier soir image/smile.png' class='bbc_emoticon' alt=':)' />



    K.
Connectez-vous ou Inscrivez-vous pour répondre.