2013-05-04 1 views
0

J'ai deux init init avec deux fichiers plist différents, les fichiers plist sont dans le dossier de documents non inclus dans le bundle et sont donc éditables.Tableau de données de mise à jour de plist

progress = [[NSMutableArray alloc] initWithContentsOfFile:[self progressFilePath]]; 
    easy = [[NSMutableArray alloc] initWithContentsOfFile:[self easyFilePath]]; 

le plist progrès est vide insted la facilité est:

<array> 
    <dict> 
     <key>TitleEN</key> 
     <string>Hunter</string> 
     <key>Status</key> 
     <integer>0</integer> 
     <key>Image</key> 
     <string></string> 
    </dict> 
</array> 

Maintenant, à mon avis, j'ai un tableView chargé avec facile et je voudrais que la presse élément de la ligne, si son statut est 0 il va à la plist de progrès, définir l'objet pour la clé Image dans dog.png dans progress.plist également mis l'objet 0 pour l'état de la clé, mais dans le facile. Je l'ai fait tout avec ceci:

NSNumber *status = [[easy objectAtIndex:indexPath.row] objectForKey:@"Status"]; 
    if ([status intValue] == 0) { 

      [progress addObject:[easy objectAtIndex:indexPath.row]]; 

     int progresstot = [progress count]; 
     for (int i=0; i<progresstot; i++) { 
      if ([[progress objectAtIndex:i] objectForKey:@"TitleEN"] == [[easy objectAtIndex:indexPath.row] objectForKey:@"TitleEN"]) { 
       [[progress objectAtIndex:i] setObject:@"dog.png" forKey:@"Image"]; 
      } 
     } 
      [progress writeToFile:[self progressFilePath] atomically:YES]; 
[[easy objectAtIndex:indexPath.row] setObject:[NSNumber numberWithInt:1]  forKey:@"Status"]; 
      [easy writeToFile:[self easyFilePath] atomically:YES]; 
     } 

Tout fonctionne bien, mais je ne peux pas comprendre pourquoi à la fin de cette méthode, j'ai mon progress.plist avec mon élément avec dog.png mais aussi je dog.png sur le facile. (Le statut est seulement mis à jour sur facile et fonctionne bien mais dog.png sur les deux). Tout le monde peut m'aider? Je ne peux pas comprendre ce qui ne va pas.

Répondre

0
[progress addObject:[easy objectAtIndex:indexPath.row]]; 

Vous ajoutez l'objet p1 == [de objectAtIndex facile: indexPath.row] au tableau de progression, un tableau progrès maintenant conservé p1 et a comme l'un de ses éléments. Il n'a pas créé le nouvel objet, il a conservé l'existant - p1.

for (int i=0; i<progresstot; i++) { 
    if ([[progress objectAtIndex:i] objectForKey:@"TitleEN"] == 
      [[easy objectAtIndex:indexPath.row] objectForKey:@"TitleEN"]) 
    { 
     [[progress objectAtIndex:i] setObject:@"dog.png" forKey:@"Image"]; 
    } 
} 
  • Dans l'instruction if vous voulez comparer le contenu des objets, mais pas les pointeurs, je suppose.
  • Une fois de plus, dans les deux tableaux, vous avez un pointeur (p1) vers le même objet, donc quand vous faites [p1 setObject: forKey:]; - vous le faites pour les deux tableaux.
+0

Compris! Comment puis-je copier l'objet facile dans le tableau de progression? – Tortuga

+0

Eh bien, puisque vous travaillez avec l'objet objectif-C classique (dérivé de NSObject), vous pouvez juste faire * NSObject * itemToAdd = [[easy objectAtIndex: indexPath.row] copy]; [progress addObject: itemToAdd]; [itemToAdd release]; * Nous avons publié itemToAdd, parce que le tableau va le conserver et nous ne voulons pas fuir * copié * article après – makaron

+0

Cela ne fonctionne pas, me montre cette erreur. 'terminaison application en raison d'exception non interceptée NSInternalInconsistencyException, raison: - [__ NSCFDictionary setObject: forKey:]: méthode de mutation envoyée à objet immuable' Aussi je ne peux pas libérer * itemToAdd parce que j'utilise ARC – Tortuga

Questions connexes