доступ к списку в пакете приложения возвращает ноль - PullRequest
12 голосов
/ 05 августа 2011

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

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

Ошибка файла initWithContentsOf (массив имеет значение null, что свидетельствует о том, что он не может найти plist в комплекте приложений).

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

[env Xcode 4.2 beta, iOS 4.3.2].

Ответы [ 3 ]

27 голосов
/ 05 августа 2011

Вы должны использовать 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не работает.

3 голосов
/ 12 марта 2013

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)

0 голосов
/ 31 января 2014

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

- (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);
    }
}
...