2014-06-30 5 views
1

J'ai enregistré un nsmutableArray dans un NSUserDefaults. Dans le cas suivant, il semble que tous les éléments du tableau sont égaux à 0, même si dans ce cas, la position 1 et la position 5 doivent avoir 1 comme valeur au lieu de 0. Je sais que les éléments NSUserDefaults sont immuables mais ... J'ai ajouté cette variable mutableCopy lors de l'extraction de la valeur.NSUserDefaults ne peut pas mettre à jour un tableau nsmutable

Où est-ce que je me trompe?

//create array 

NSMutableArray *objArray = [[NSMutableArray alloc] init]; 
     for (int i=0; i< 100;i++) [objArray addObject:@"0"]; 
     [objArray replaceObjectAtIndex:1 withObject:@"1"]; 
     [[NSUserDefaults standardUserDefaults] setObject:objArray forKey:name]; 

// update 

elementPosition = 5; 
NSMutableArray *objArray = [[NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:name]] mutableCopy]; 
     [objArray replaceObjectAtIndex:elementPosition withObject:@"1"]; 


//check the array 


NSMutableArray *objArray = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:nameFile]]; 
    BOOL displayContent = true; 


for (int i=0; i<[objArray count];i++) 
{ 

if ([[objArray objectAtIndex:i] isEqualToString:@"0"]) 
{ 
    displayContent = false; 
} 
} 

Répondre

0

Remplacez votre code avec ceci:

//create array 

NSMutableArray *objArray = [[NSMutableArray alloc] init]; 
for (int i=0; i< 100;i++){ 
    [objArray addObject:@"0"]; 
} 
[objArray replaceObjectAtIndex:1 withObject:@"1"]; 
[[NSUserDefaults standardUserDefaults] setObject:objArray forKey:name]; 

//First mistake. Missing this. Without this line the data is not saved in NSUserDefaults 
[[NSUserDefaults standardUserDefaults] synchronize]; 

// update 

elementPosition = 5; 
NSMutableArray *objArray = [[NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:name]] mutableCopy]; 
[objArray replaceObjectAtIndex:elementPosition withObject:@"1"]; 

//Second Mistake. You did not update the NSUserDefaults again. 
[[NSUserDefaults standardUserDefaults] setObject:objArray forKey:name]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 




//check the array 
NSMutableArray *objArray = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:name]]; 
BOOL displayContent = true; 


for (int i=0; i<[objArray count];i++) 
{ 

    if ([[objArray objectAtIndex:i] isEqualToString:@"0"]) 
    { 
     displayContent = false; 
    } 

    //Third mistake. Once the BOOL is made false in an if block you have to make it true in the else block, otherwise the value of the BOOL will remain false even if it does not enter the if block. 
    else{ 
     displayContent = true; 
    } 
    NsLog(@"ArrayIndex=[%d];DisplayContent=[%d]",i,displayContent); 
} 

Bonne codage.

+0

Pourquoi ai-je besoin d'utiliser cette synchronisation? J'ai fait quelques tests et il semble que le tableau NUserDefault est sauvegardé sans cette synchronisation. Et deuxièmement retarder cette troisième erreur, j'ai besoin d'une valeur de bool pour être faux dans le cas où il y a un objet dans le tableau pour lequel la valeur est 0 au lieu de 1. –

+0

La méthode de synchronisation est invoquée automatiquement à intervalles périodiques. Mais nous voulons enregistrer les données immédiatement et ne pas attendre la synchronisation automatique (par exemple, si votre application est sur le point de sortir) ou si vous souhaitez mettre à jour les valeurs par défaut de l'utilisateur sur le disque même si vous n'avez effectué aucune modification. –

+0

Cochez cette case: https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsuserdefaults_class/reference/reference.html#//apple_ref/occ/instm/NSUserDefaults/synchronize –

1

Vous devez appeler la méthode Synchronize

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

pourquoi devrais-je faire cela? –

+0

Vous devriez appeler cela après l'objet 'set' pour les valeurs par défaut de l'utilisateur. – LLIAJLbHOu

+0

> synchronize Ecrit les modifications apportées aux domaines persistants sur le disque et met à jour tous les domaines persistants non modifiés sur ce qui est sur le disque. - (BOOL) synchroniser Valeur de retour OUI si les données ont été enregistrées avec succès sur le disque, sinon NO. Discussion Étant donné que cette méthode est appelée automatiquement à intervalles réguliers, utilisez cette méthode uniquement si vous ne pouvez pas attendre la synchronisation automatique (par exemple, si votre application est sur le point de quitter) ou si vous souhaitez mettre à jour les valeurs par défaut. disque même si vous n'avez fait aucun changement. –

2

Je pense que lorsque vous récupérez et votre tableau mutable de userDefault et mis à jour, mais vous ne l'avez pas mis ce nouvel objet mis à jour userDefault, son ayant l'ancien objet qui a été défini avant. vous devez stocker votre tableau de mise à jour à userdefault avec la même clé qui met à jour votre UserDefautlt.

elementPosition = 5; 
NSMutableArray *objArray = [[NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:name]] mutableCopy]; 
     [objArray replaceObjectAtIndex:elementPosition withObject:@"1"]; 
[[NSUserDefaults standardUserDefaults] setObject:objArray forKey:name]; 
+0

vous avez raison. Il semble que c'était le problème. thx) –

1

Je pense que vous devez corriger votre code suivre mon code ci-dessous:

[[NSUserDefaults standardUserDefaults] setObject:objArray forKey:name]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

...

NSMutableArray *objArray = [[NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:name]] mutableCopy]; 
[objArray replaceObjectAtIndex:elementPosition withObject:@"1"]; 
[[NSUserDefaults standardUserDefaults] setObject:objArray forKey:nameFile]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
Questions connexes