Iphone 在iOS中将键值对添加到plist文件时出现问题

Iphone 在iOS中将键值对添加到plist文件时出现问题,iphone,objective-c,ios,Iphone,Objective C,Ios,我在iphone应用程序中有一个视图控制器,它向plist文件添加一个键值对。然后,它在带有表视图的视图控制器中显示整个plist。我遇到的问题是,它只会显示iPhone模拟器中的值,如果我完全重新启动应用程序,它只会显示新的键值对 注意:plist文件应该添加到应用程序的资源目录中 更新:下面的代码是我问题的解决方案,另外,为了查看plist中的新条目,我实现了一个刷新按钮,它基本上运行viewDidLoad中的部分 添加键值对的视图控制器的代码如下: - (IBAction)addActio

我在iphone应用程序中有一个视图控制器,它向plist文件添加一个键值对。然后,它在带有表视图的视图控制器中显示整个plist。我遇到的问题是,它只会显示iPhone模拟器中的值,如果我完全重新启动应用程序,它只会显示新的键值对

注意:plist文件应该添加到应用程序的资源目录中 更新:下面的代码是我问题的解决方案,另外,为了查看plist中的新条目,我实现了一个刷新按钮,它基本上运行viewDidLoad中的部分

添加键值对的视图控制器的代码如下:

- (IBAction)addAction:(UIBarButtonItem *)sender
{    
    NSString *myFile=[[NSBundle mainBundle] pathForResource:@"File" ofType:@"plist"];

    dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:myFile];

    NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *filePath=[docDir objectAtIndex:0];
    NSString *plistPath=[filePath stringByAppendingPathComponent:@"File.plist"];

    //Check plist's existance using FileManager
    NSError *err=nil;
    NSFileManager *fManager=[NSFileManager defaultManager];

    if(![fManager fileExistsAtPath:plistPath])
    {
        //file doesn't exist, copy file from bundle to documents directory

        NSString *bundlePath=[[NSBundle mainBundle] pathForResource:@"File" ofType:@"plist"];
        [fManager copyItemAtPath:bundlePath toPath:plistPath error:&err];
    }

    //Get the dictionary from the plist's path
    dictionary =[[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    //Manipulate the dictionary
    [dictionary setObject:textContent forKey:textName];
    //Again save in doc directory.
    [dictionary writeToFile:plistPath atomically:YES];    
}
这是在另一个视图控制器的表视图中显示plist的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Initialize table data

    NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *filePath=[docDir objectAtIndex:0];
    NSString *plistPath=[filePath stringByAppendingPathComponent:@"File.plist"];


    dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:**plistPath**];
    verses = [dictionary allKeys];

    [self.mainTableView reloadData];

}

谢谢你的帮助

在设备上,如果要写入文档目录路径,则主捆绑包是只读的。你可以通过

NSArray path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)


更改仅在启动时显示的原因是文件名不匹配

您是否在添加到plist后在UITableView上调用-(void)reloadData?假设tableview使用plist作为其数据源。起初我没有,但现在我只是尝试了一下,它仍然像以前一样运行。我明白了。。但是我已经在写新的键值对的视图控制器中这样做了。您的意思是将其放在显示它的视图控制器中吗?@user1186173您似乎(1)从您的包中加载plist;(2) 将文件复制到您的文档文件夹中;(3) 将plist的新副本保存到您的包中。在iOS上,捆绑包是只读的,因此最终的效果是,由于您未能修改原始未修改文件,所以捆绑包中仍有原始未修改文件,而由于您甚至没有尝试修改原始未修改文件,所以捆绑包中有原始未修改文件的副本。特别检查您对
writeToFile:
的调用。是的,如果您想稍后从文档副本中读回值,则需要打开文档副本。哦,您是对的。这是有道理的,我把它添加到了原来的文件路径,但它根本不是正确的路径。。。很抱歉没听清楚,我还是个新手。因此,我做了一些更改(请参见**中的原始代码),现在我可以看到我添加的第一行,但如果我再添加,我将不得不重新启动应用程序才能看到它。我假设我在查看的地方做错了什么,所以我要做的就是添加一个按钮和一个基本上会重做初始viewDidLoad过程的操作。我更愿意让它自动加载所有的时间,但这将做现在。非常感谢你的帮助