从用户文档而不是 NSBundle 访问 Plist

Posted

技术标签:

【中文标题】从用户文档而不是 NSBundle 访问 Plist【英文标题】:Accessing Plist from user documents instead of NSBundle 【发布时间】:2014-07-31 14:50:25 【问题描述】:

您好,我有以下完美运行的代码,它会找到 Plist 并将 NSDictionary 分配给我的名为landingSites 的NSArray。唯一的问题是我希望用户能够添加站点,因此需要将 Plist 存储在用户文档中,而不是 NSBundle:

plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
NSMutableDictionary *newDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
dictionaryKeys = [newDictionary allKeys];
self.landingSites = [dictionaryKeys sortedArrayUsingSelector:@selector(compare:)];
self.dictionaryFromPlist = newDictionary;

[Picker selectRow:0 inComponent:0 animated:NO];

for(NSString *parent in dictionaryKeys) 

    NSDictionary *parentData = [dictionaryFromPlist objectForKey:parent];
    NSArray *child = [parentData objectForKey:@"Name"];
    NSLog(@"%@", child);

到目前为止,我已经生成了下面的代码,但是每当我运行程序时,if 语句总是会执行,就好像 plist 从未复制到用户文档一样。另外,我不知道如何像上面那样将NSDictionary 内容附加到我的landingSites 数组中。请帮忙

 (void) viewDidLoad 
        [super viewDidLoad];
        NSError *error;
        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,  NSUserDomainMask,YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Data.plist"];
        NSFileManager *fileManager = [NSFileManager defaultManager];

        if (![fileManager fileExistsAtPath:path]) 
            NSLog(@"copying database to users documents");
            NSString *pathToSettingsBundle = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
            [fileManager copyItemAtPath:pathToSettingsBundle toPath:path error:&error];
        
        else
            NSLog(@"users database already configured");
        

【问题讨论】:

您是否检查过Data.plist 不存在于Documents 目录中?如果fileExistsAtPath: 正在返回YES,那么这是有原因的。 【参考方案1】:
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,  NSUserDomainMask,YES);

NSDocumentationDirectory 是错误的。您正在寻找NSDocumentDirectoryNSLibraryDirectory

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

【讨论】:

谢谢@Putz1103,一定是打字错误,代码现在可以工作了。最后请您回答我问题的后半部分。如何像在使用 NSBundle 的第一个代码块中那样将 NSDictonary 的内容输入到我的landingSites NSArray 中 如果它是完全相同的文件(至少键入),那么完全相同的方式。从包中读取 plist 文件和从另一个目录读取 plist 文件的行为完全相同。

以上是关于从用户文档而不是 NSBundle 访问 Plist的主要内容,如果未能解决你的问题,请参考以下文章

从 nsbundle 访问图像

无法访问集合下的文档

应用更新后 [NSBundle appStoreReceiptURL] 的收据是不是仍然存在

IOS NSBundle使用(访问文件夹)

NSBundle 不同文件夹中的两张图片同名

使用书签但从表单而不是表或查询访问 Word