我在资源文件夹中创建了save.plist。我直接在其中写了一些数据(不使用编码)。我能够读取该数据,但我无法通过代码写入同一个save.plist。通过使用以下代码,我试图写入数据,但它存储在我的.app plist中。 代码在这里
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"]);
我想要的是,我想写的数据应该只写入存储在引用中的save.plist。我是这个概念的新手。所以,如果有人知道,请帮助我。 提前致谢。 : - )
答案 0 :(得分:26)
我不知道我是否理解你的问题,但如果你想在.app包中写入.plist,你可能做错了。如果您想存储偏好设置,则应考虑使用NSUserDefaults 如果你真的想修改捆绑的.plist - 这里有一些代码:
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]];
}
}
<强>更新强>
Nate Flink指出上面使用的一些NSFileManager方法已被弃用。
他发布了以下替换方法的答案:
https://stackoverflow.com/a/12428472/100848
答案 1 :(得分:9)
weichsel最新版本的原始实例(谢谢!)。 Xcode抛出了一些警告,其中一个是NSFileManager上不推荐使用的方法。使用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];
}
}
答案 2 :(得分:4)
当您构建应用程序时,它将创建一个可执行文件“appName.app”,并且所有文件都在该包中构建。因此,当应用程序运行时,您无法访问资源文件夹,因为所有数据都在捆绑包中(不在文件夹中)。
但是,您可以访问包含应用程序某些信息的临时文件夹。 你可以在这里找到临时文件夹: 打开查找程序 - 单击您的用户名(在“位置”下) - 库 - 应用程序支持 - iPhone模拟器 - 用户 - 应用程序 - (在这里您可以找到iPhone应用程序的所有临时文件夹)
您可以通过以下方式访问此临时文件夹:
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
如果您将文件命名为save.plist,则可以像这样访问它:
NSString *filePath = [documentsDirectory stringByAppendingString:@"_save.plist"];
然后您只需将文件保存到此filePath,它将出现在名为“Documents_save.plist”的临时文件夹中。
*请注意,每次运行应用程序时,临时文件夹的名称都会有所不同。
为您推荐一本书:“开始iPhone开发 - 探索iPhone SDK”。在第11章中,您可以找到您想要的内容。
答案 3 :(得分:4)
总结一些其他答案:
问题在于您尝试将文件写回包含应用程序的文件夹中。该文件夹在运行时不可写。你正在做的一切都很好,你只需要选择一个不同的位置来编写你的文件。
您可以使用NSSearchPathForDirectoriesInDomains函数为此数据查找更合适的文件夹。 (例如@“Documents”文件夹。)
答案 4 :(得分:1)
试试这个:
-(void)add:(NSRunningApplication *) app {
if ([self contains:app]) return;
[self.apps addObject:app.localizedName];
[self.apps writeToFile:self.dataFile atomically:YES];
}
来自“Cocoa Programming”。
答案 5 :(得分:0)
你必须将你的plist复制到文档目录中...... 因为如果不保存到文档文件中就无法保存任何内容....当您复制它时,将允许在plist上编写/修改