3
-(void)login{
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:@"login" ofType:@"plist"];

    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];

    [plistDict setObject:@"si" forKey:@"stato"];

    [plistDict writeToFile:path atomically: YES];
}

在 iOS 模拟器中,plist 已正确编写,但是当我尝试在 iPhone 上编写 .plist 时,它不起作用。我想这是因为错误的 .plist 路径。iOS设备是否使用不同的路径?

4

5 回答 5

5

首先,您必须检查文件是否存在于您的文档目录中。如果它没有在那里退出,那么您可以将其复制到文档目录。你可以这样做

-(void)login{
    BOOL doesExist;
    NSError *error;
    NSString *filePath= [[NSBundle mainBundle] pathForResource:@"login" ofType:@"plist"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString * path =[[NSString alloc] initWithString:[documentsDirectory stringByAppendingPathComponent:@"login.plist"]];

    doesExist= [fileManager fileExistsAtPath:path];
    if (doesExist) {
        NSMutableDictionary* plistDict=[[NSMutableDictionary alloc] initWithContentsOfFile:path];                
    }
    else
    {    

        doesExist= [fileManager copyItemAtPath:filePath  toPath:path error:&error];
        NSMutableDictionary* plistDict=[[NSMutableDictionary alloc] initWithContentsOfFile:filePath];        
    }  

    [plistDict setObject:@"si" forKey:@"stato"];

    [plistDict writeToFile:path atomically: YES];
}
于 2012-09-02T15:03:51.263 回答
2

您不能写入 [NSBundle mainBundle] 位置。为了像 plist 一样编写文件,您应该以这种方式保存在文档文件夹中:

NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *filePathToSave = [arrayPaths objectAtIndex:0];

如果 plist 是您的应用程序的一部分,我建议您在第一次启动时已经使用 same 将其复制到文档文件夹中filePathToSave,这样您就可以一直在那里查看它,无论是阅读还是保存。

于 2012-09-02T14:25:00.883 回答
1

这是一个很大的错误,因为只有主包是可读的,并且只能在编译时在 App Bundle 中组合。App Bundle 位于一个单独的位置,而您应该写入磁盘的数据应该放在沙盒的 Documents、Temporary 或 Library 文件夹中。

要获得更多了解,请阅读官方文件系统编程指南
你需要知道的一切都写在那里。
您也可以写入子文件夹,并且在与 iTunes 或 iCloud 同步时,您应该在备份方面在上述 3 个主目录之间进行选择。例如,不会备份 tmp 文件夹中的内容。

于 2012-09-02T14:57:06.053 回答
0

您不能写入 iOS 设备上的 mainBundle。您必须将文件保存到一个目录并在那里进行修改。

于 2012-09-02T14:17:23.377 回答
0

只是为了将答案带入现代世界 - 你真的应该使用基于 URL 的方法来获取目录:

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSURL *URLForDocumentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]
于 2012-09-02T14:32:29.040 回答