Como escrever dados em plist?

Eu criei save.plist em uma pasta de resources. Eu escrevi alguns dados dentro disso diretamente (sem usar codificação). Eu sou capaz de ler esses dados, mas eu não sou capaz de escrever através do código para o mesmo save.plist. Usando o código a seguir, estou tentando gravar os dados, mas eles ficam armazenados no meu aplicativo. O código está 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"]); 

Eu quero que, os dados que eu quero escrever devem ser gravados em save.plist apenas que é armazenado em referências. Eu sou novo com este conceito. Então, se alguém souber, por favor me ajude. Desde já, obrigado. 🙂

Não sei se entendi sua pergunta, mas se você quiser escrever em um .plist dentro do seu pacote .app, provavelmente está fazendo algo errado. Se você deseja armazenar preferências, considere usar NSUserDefaults .
Se você realmente quer modificar um arquivo .plist – aqui está um 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]]; } } 

Atualizar:
Nate Flink apontou que alguns dos methods NSFileManager usados ​​acima são obsoletos. Ele postou uma resposta com os methods de substituição abaixo: https://stackoverflow.com/a/12428472/100848

Versão atualizada do exemplo impressionante original por weichsel (obrigado!). O Xcode lançou alguns avisos, um dos quais é um método obsoleto no NSFileManager. Atualizado aqui com methods não obsoletos do 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]; } } 

Quando você cria o aplicativo, ele cria um arquivo executável “appName.app” e todos os arquivos são criados no pacote. Portanto, você não pode acessar a pasta de resources quando o aplicativo estiver em execução, porque todos os dados estão no pacote (não na pasta).

No entanto, você pode acessar uma pasta temporária que contém algumas informações do aplicativo. Você pode encontrar a pasta temp aqui: Abra o localizador – clique no seu nome de usuário (em lugares) – Biblioteca – Suporte de Aplicação – iPhone Simulator – Usuário – Aplicativos – (aqui você pode encontrar todas as pastas temporárias do seu aplicativos do iPhone)

Você pode acessar esta pasta temporária por:

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

Se você nomear seu arquivo save.plist, poderá acessá-lo da seguinte maneira:

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

Em seguida, salve seu arquivo nesse arquivo e ele aparecerá na pasta temporária chamada “Documents_save.plist”.

* Observe que o nome da pasta temp varia toda vez que você executa o aplicativo.

Recomende um livro para você: 《Iniciando o desenvolvimento do iPhone – Explorando o iPhone SDK》. No Capítulo 11, você pode encontrar o que deseja.

Para resumir algumas das outras respostas:

Seu problema é que você está tentando gravar o arquivo de volta na pasta que contém seu aplicativo. Essa pasta não é gravável em tempo de execução. Tudo o que você está fazendo está bem, você só precisa escolher um local diferente para escrever o seu arquivo.

Você pode usar a function NSSearchPathForDirectoriesInDomains para encontrar uma pasta mais adequada para esses dados. (Como a pasta @ “Documentos”.)

tente isto:

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

de “programação de cacau”.

você tem que copiar o seu plist no diretório do documento … porque você não pode salvar nada sem salvar no arquivo do documento …. quando você copiou ele permitirá gravar / modificar no plist