Enregistrement d'un tableau dans un file Objectif C

Je suis coincé là-dessus pour toujours et j'ai finalement compris et maintenant tout à fait à l'improviste il a cessé de fonctionner à nouveau …

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; NSSsortingng *filePath = [NSSsortingng ssortingngWithFormat:@"%@/scoreCards.dgs",documentsDirectory]; NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init]; savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; [savedArrayOfScorecards addObject:currentScoreCard]; [savedArrayOfScorecards writeToFile:filePath atomically:YES]; 

Le file scoreCards.dgs n'est même pas créé …

Qu'est-ce que je fais mal?

Il pourrait y avoir quelques choses qui ne vont pas ici.

1) Le type de données que vous stockez dans le tableau peut ne pas être encodable ou archivable dans un file. Et l'extrait de code que vous avez inclus ne donne pas un bon indice quant au type de données que vous essayez d'save. Si vous avez des objects personnalisés dans votre tableau (c'est-à-dire des objects qui ne sont pas NSSsortingng, NSNumber, NSDate, etc.), alors c'est définitivement le problème. Il y a beaucoup de questions sur StackOverflow qui pourraient vous aider à résoudre ce problème.

2) Le path du file de votre tableau pourrait être faux. Par exemple, vous ne vérifiez pas si "documentsDirectory" est nul ou valide ou inscriptible.

3) Également possible, mais peu probable, " savedArrayOfScorecards " pourrait être un tableau nul. Vous devriez faire une vérification d'erreur pour vous assurer que " savedArrayOfScorecards " a été instancié et qu'il y a plus d'un object dans le tableau.

Votre problème est que, bien que vous créez un tableau, avant de lire le file, il devient nul pour votre appel à:

 savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; 

Donc, comme SavedArrayOfScorecards est maintenant nul, votre appel pour l'écrire dans un file ne fait rien. Vous devez charger le tableau dans une autre variable, et vérifier qu'il est nul, et ne créer le nouveau tableau que si celui lu dans le file est nul. Quelque chose comme ça:

 NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; if (!savedArrayOfScorecards) { savedArrayOfScorecards = [[NSMutableArray alloc]init]; } 

Êtes-vous sûr que le file existe lors du chargement?

 savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; 

Cette ligne crée un nouveau NSMutableArray à partir du file. Si le file n'existe pas, il renvoie zéro. writeToFile est alors envoyé à zéro et rien ne se passera.

Ajoutez une coche pour voir si c'est nul et créez un nouveau tableau si c'est:

 NSMutableArray *savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; if(savedArrayOfScorecards == nil) savedArrayOfScorecards = [NSMutableArray array]; [savedArrayOfScorecards addObject:currentScoreCard]; [savedArrayOfScorecards writeToFile:filePath atomically:YES]; 

NSMutableArray n'est pas un format conforme à la list de propriétés. Vous devez utiliser un NSArchiver pour le rendre conforme à la norme.

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; NSSsortingng *filePath = [NSSsortingng ssortingngWithFormat:@"%@/scoreCards.dgs",documentsDirectory]; NSMutableArray *savedArrayOfScorecards = [[NSMutableArray alloc]init]; savedArrayOfScorecards = [NSMutableArray arrayWithContentsOfFile:filePath]; [savedArrayOfScorecards addObject:@"ALLLAALLAAALLA"]; NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data]; [archive encodeObject:savedArrayOfScorecards forKey:@"Scorecards"]; [archive finishEncoding]; BOOL result = [data writeToFile:filePath atomically:YES]; NSLog(result ? @"YES" : @"NO"); 

entrez la description de l'image ici

Les bonnes réponses sont déjà là, juste en ajoutant une meilleure solution:

 NSFileManager* fileManager = [NSFileManager defaultManager]; NSMutableArray* array; if ([fileManager fileExistsAtPath:filePath]) { array = [NSMutableArray arrayWithContentsOfFile:filePath]; NSAssert(array != nil, @"Invalid data in file."); } else { array = [[NSMutableArray] alloc] init]; } [array addObject:currentScoreCard]; [array writeToFile:filePath atomically:YES];