Cómo escribir datos en plist?

He creado save.plist en una carpeta de recursos. He escrito algunos datos dentro de eso directamente (sin usar la encoding). Puedo leer esos datos pero no puedo escribir a través del código en el mismo save.plist. Al utilizar el siguiente código, bash escribir los datos, pero se almacenan en mi pliego .app. El código esta aqui

NSString *errorDesc = nil; NSPropertyListFormat format; NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"save" ofType:@"plist"]; NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; NSMutableDictionary *temp = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; if (!temp) { NSLog(errorDesc); [errorDesc release]; } // [temp setValue:@"123" forKey:@"line1"]; // [temp writeToFile:plistPath atomically: YES]; //Reading data from save.plist NSLog([temp objectForKey:@"name"]); NSLog([temp objectForKey:@"wish"]); NSNumber *num=[temp valueForKey:@"roll"]; int i=[num intValue]; printf("%d",i); //writitng the data in save.plist [temp setValue:@"green" forKey:@"color"]; [temp writeToFile:plistPath atomically: NO]; NSMutableDictionary *temp1 = (NSMutableDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; NSLog([temp objectForKey:@"color"]); 

Quiero eso, los datos que quiero escribir deberían escribirse solo en save.plist, que está almacenado en las referencias. Soy nuevo con este concepto. Entonces, si alguien lo sabe, por favor, ayúdenme. Gracias por adelantado. 🙂

No sé si entiendo tu pregunta, pero si quieres escribir en una .plist dentro de tu paquete .app probablemente estés haciendo algo mal. Si desea almacenar preferencias, debe considerar usar NSUserDefaults .
Si realmente quieres modificar un .plist incluido, aquí hay un código:

 NSString *plistPath = nil; NSFileManager *manager = [NSFileManager defaultManager]; if (plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Contents/Info.plist"]) { if ([manager isWritableFileAtPath:plistPath]) { NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; [infoDict setObject:[NSNumber numberWithBool:hidden] forKey:@"LSUIElement"]; [infoDict writeToFile:plistPath atomically:NO]; [manager changeFileAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] atPath: [[NSBundle mainBundle] bundlePath]]; } } 

Actualizar:
Nate Flink señaló que algunos de los métodos de NSFileManager utilizados anteriormente están en desuso. Publicó una respuesta con los siguientes métodos de reemplazo: https://stackoverflow.com/a/12428472/100848

Versión actualizada del impresionante ejemplo original de weichsel (¡gracias!). Xcode lanzó un par de advertencias, uno de los cuales es un método obsoleto en NSFileManager. Actualizado aquí con métodos no obsoletos de iOS 5.1

  NSString *plistPath = nil; NSFileManager *manager = [NSFileManager defaultManager]; if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"mySpecial/PathTo.plist"])) { if ([manager isWritableFileAtPath:plistPath]) { NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; [infoDict setObject:@"foo object" forKey:@"fookey"]; [infoDict writeToFile:plistPath atomically:NO]; [manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil]; } } 

Cuando construya la aplicación, creará un archivo ejecutable “appName.app” y todos los archivos se comstackrán en el paquete. Por lo tanto, no puede acceder a la carpeta de recursos cuando la aplicación se está ejecutando porque todos los datos están en el paquete (no en la carpeta).

Sin embargo, puede acceder a una carpeta temporal que contiene información de la aplicación. Puede encontrar la carpeta temporal aquí: Abrir buscador – haga clic en su nombre de usuario (en LUGARES) – Biblioteca – Soporte de aplicación – Simulador de iPhone – Usuario – Aplicaciones – (aquí puede encontrar todas las carpetas temporales de su aplicaciones de iPhone)

Puede acceder a esta carpeta temporal de la siguiente manera:

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

Si nombra su archivo save.plist, puede acceder a él de esta manera:

 NSString *filePath = [documentsDirectory stringByAppendingString:@"_save.plist"]; 

Luego, simplemente guarde su archivo en este filePath y aparecerá en la carpeta temporal llamada “Documents_save.plist”.

* Tenga en cuenta que el nombre de la carpeta temporal varía cada vez que ejecuta la aplicación.

Recomiende un libro para usted: “Inicio del desarrollo de iPhone – Exploración del iPhone SDK”. En el Capítulo 11 puedes encontrar lo que quieres.

Para resumir algunas de las otras respuestas:

Tu problema es que estás tratando de volver a escribir el archivo en la carpeta que contiene tu aplicación. Esa carpeta no se puede escribir en el tiempo de ejecución. Todo lo que estás haciendo está bien, solo necesitas elegir una ubicación diferente para escribir tu archivo.

Puede usar la función NSSearchPathForDirectoriesInDomains para buscar una carpeta más adecuada para estos datos. (Como la carpeta @ “Documentos”).

prueba esto:

 -(void)add:(NSRunningApplication *) app { if ([self contains:app]) return; [self.apps addObject:app.localizedName]; [self.apps writeToFile:self.dataFile atomically:YES]; } 

de “Cocoa Programming”.

tienes que copiar tu plist en el directorio de documentos … porque no puedes guardar nada sin guardar en el archivo del documento … cuando lo copiaste, podrás escribir / modificar en plist