2011-10-07 6 views
3

J'ai un plist avec le format suivant:écrit NSArray Retour à plist

enter image description here

Et voici comment je l'ai lu:

NSString *errorDesc = nil; 
    NSPropertyListFormat format; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:path]; 
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization      
              propertyListFromData:plistXML 
              mutabilityOption:NSPropertyListMutableContainersAndLeaves 
              format:&format 
              errorDescription:&errorDesc]; 

    self.statesData = [temp objectForKey:@"Root"]; 

La question est de savoir si je veux écrire ce NSMutableArray appelé self.statesData retour à la plist, comment le ferais-je? Je devine que quelque chose comme ça ne fonctionnerait pas ...

NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"]; 
    [self.main.statesData writeToFile:path atomically: YES]; 

Répondre

2

Vous ne pouvez pas écrire le paquet de l'application, vous devez écrire dans le répertoire des documents de l'application.

Exemple de code:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 

BOOL status = [array writeToFile:filePath atomically:YES]; 

Si vous avez père initial dans le paquet de l'application lors de la première course la copier dans le répertoire des documents et faire tout autre accès au répertoire des documents.

+0

esprit montrant un code? et est-ce que je l'écris juste comme je l'ai spécifié ci-dessus? Comme ce tableau est censé être sous la racine (si vous voyez ma structure de plist ci-dessus) – xonegirlz

+0

Juste posté du code. Pour les listes de propriétés, réalisez-les simplement comme NSArray ou NSDictionary selon le type de racine, – zaph

+0

qu'est-ce que fileName là – xonegirlz

2

Sur iOS, vous ne pouvez pas écrire dans les fichiers de votre application (et sur MacOS X, vous ne devriez pas écrire). Ce que vous devez faire est d'abord copier dans le dossier Documents à partir de l'encapsuleur de l'application, puis charger et enregistrer dans cette version.

Obtenir le dossier Documents:

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
; 
filePath = [filePath stringByAppendingPathComponent:@"States.plist"]; 
[self.statesData writeToFile:path atomically:YES]; 

Chargement du fichier de l'emballage de l'application que vous faites déjà; la copie peut être faite facilement en utilisant NSFileManager. Vous pouvez reconstituer le tableau temporaire et remplacer la clé de votre étatData avant de l'enregistrer. Une autre commande de lecture peut être:

self.statesData = [NSArray arrayWithContentsOfFile:filePath]; 
+0

Je le lis à partir de l'ensemble de l'application, mais je l'écris ailleurs ... alors qu'est-ce que je dois changer ma lecture de sorte qu'il charges de ce que j'écris – xonegirlz

+0

Si je comprends ce que vous demandez, il suffit de changer la ligne de lecture ci-dessus pour utiliser filePath. Ou utilisez la méthode NSArray arrayWithContentsOfFile: –

0

Version SWIFT du code @ Zaph ci-dessus:

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
let documentsDirectory = paths[0] 
let filePath = NSURL(fileURLWithPath: documentsDirectory, isDirectory: true).URLByAppendingPathComponent(fileName) 
let status = items.writeToFile(filePath.absoluteString, atomically: true) 
Questions connexes