Доступ к plist в комплекте приложений возвращает null

Я использую кусок кода, который я использовал раньше, чтобы загрузить plist в массив:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"species_names" ofType:@"plist"];
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];

Файл initWithContentsOf не работает (массив имеет значение null, предполагая, что он не может найти plist в комплекте приложения).

Под симулятором iPhone я проверил, что путь, созданный первой строкой, указывает на файл приложения (он делает) и использовал контекстное меню Finder "Показать пакеты", чтобы доказать себе, что "species_name.plist" на самом деле находится в комплекте - с длиной, которая предполагает, что она содержит материал, поэтому она должна работать (и в других приложениях iOS, которые я написал). Предложения наиболее приветствуются...

[env Xcode 4.2 beta, iOS 4.3.2].

Ответ 1

Вам следует использовать метод initWithContentsOfFile: экземпляра NSDictionary, а не NSArray. Вот пример:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"species_names" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
NSArray *array = [NSArray arrayWithArray:[dict objectForKey:@"Root"]];

Или это:

NSString *errorDesc = nil;
NSPropertyListFormat format;
NSString    *path = [[NSBundle mainBundle] pathForResource:@"startups" ofType:@"plist"];
NSData      *plistXML = [[NSFileManager defaultManager] contentsAtPath:path];
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization                     
                                          propertyListFromData:plistXML
mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                          format:&format
                                          errorDescription:&errorDesc];
NSArray *array = [NSArray arrayWithArray:[temp objectForKey:@"Root"]];


ИЗМЕНИТЬ

Вы можете использовать initWithContentsOfFile: метод NSArray с файлом, созданным с помощью метода writeToFile:atomically: NSArray. Plist, созданный с помощью writeToFile:atomically:, имеет эту структуру:

<plist version="1.0">
<array>
    ...Content...
</array>
</plist>

И Plist, созданный в XCode, имеет эту структуру:

<plist version="1.0">
<dict>
    ...Content...
</dict>
</plist>

Вот почему initWithContentsOfFile: метод NSArray dosnt работает.

Ответ 2

plist этого типа:

enter image description here

ИЛИ (в основном оба одинаковы)

enter image description here

Можно прочитать следующим образом:

NSString *file = [[NSBundle mainBundle] pathForResource:@"appFeatures" ofType:@"plist"];
NSArray *_arrFeats = [NSArray arrayWithContentsOfFile:file];
NSLog(@"%d", _arrFeats.count);

Где appFeatures - имя plist. (iOS 6.1)

Ответ 3

Попробуйте этот простой метод:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self plistData];
}


- (void)plistData
{
    NSString *file = [[NSBundle mainBundle] pathForResource:@"appFeatures" ofType:@"plist"];
    NSArray *messages = [NSArray arrayWithContentsOfFile:file];
    NSLog(@"%d", messages.count);

    for (int i=0; i<messages.count; i++)
    {
        NSString *data = [messages objectAtIndex:i];
        NSLog(@"\n Data = %@",data);
    }
}