Strange bug with plist

2019-08-31 05:07发布

问题:

I got a very strange bug when I'm trying to read my plist. My plist looks like :

Root (Array)
            Item 0 (Dictionary)
                              title (String)

I want to display title in the log, so I did the code bellow:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *path = [basePath stringByAppendingPathComponent:@"data.plist"];
NSMutableDictionary *dict = [[NSDictionary dictionaryWithContentsOfFile:path] mutableCopy];

NSLog(@"%@", [dict objectForKey:@"title"]);

NSLog(@"Path to plist: %@", path);

With this code, NSLog(@"%@", [dict objectForKey:@"title"]); is equal to "(null)"...

My plist is in my app's documents folder, and the log of path return the good path to my plist.

Help me please :)

回答1:

The root of your plist is an array but you read it into a dictionary, thats won't work.

You should:

  • read the plist into an array
  • get item 0 (objectAtIndex:0) -> this is a dictionary
  • on this dictionary you can perform objectForKey ...


回答2:

As @Tom said, (and as you said yourself in your first code block) the root of the plist is an array.

You can load an array very similarly using:

NSArray *array = [NSArray arrayWithContentsOfFile:path];

Then you can access the item at index 0 (the dictionary) like this:

NSDictionary *dict = [array objectAtIndex:0];

Or since Xcode 4.4 with thew new array literals:

NSDictionary *dict = array[0];

And then log the title as you already tried:

NSLog(@"%@", [dict objectForKey:@"title"]);

Or with the new syntax:

NSLog(@"%@", dict[@"title"]);