arrayWithContentsOfFile не может прочитать файл plist - PullRequest
6 голосов
/ 02 июня 2011

У меня есть plist с массивом, который содержит 2 строки, см. Изображение:

http://imageshack.us/photo/my-images/263/myplist.png/

и в моем viewDidLoad я добавляю это:

NSString *file = [[NSBundle  mainBundle] pathForResource:@"Data"    ofType:@"plist"];

NSArray *array = [NSArray    arrayWithContentsOfFile:file];

NSLog(@"array = %@", array);

Но у меня всегда есть null Почему? Спасибо за помощь.

ОБНОВЛЕНИЕ: решение состоит в том, что вам нужно вручную редактировать файл plist (Xcode4 использует Dictionnary по умолчанию)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <array>
        <string>HO</string>
        <string>HI</string>
    </array>
</array>
</plist>

Ответы [ 5 ]

13 голосов
/ 02 июня 2011

Скорее всего, ваш plist - это словарь, содержащий массив (Xcode 4 не позволяет создавать списки с массивом в качестве корневого объекта). Попробуйте что-то вроде этого:

NSString *file = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:file];
NSArray *array = [dict objectForKey:@"Array"];
NSLog(@"%@", array);
0 голосов
/ 12 марта 2013

plist этого типа:

enter image description here

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

enter image description here

Может быть прочитанокак это:

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

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

0 голосов
/ 29 февраля 2012

Правильный ответ: корневой элемент уже является массивом (в XCode4 ... не уверен насчет остальных). Поэтому, если вы поместите другой массив, как показано на снимке экрана neil d , вы получите массив, содержащий массив с двумя строковыми значениями.

0 голосов
/ 11 ноября 2011

Я изучил эту тему и обнаружил некоторые различия в файле plist.

Например, у меня есть исходный файл plist в примере кода, который читается по методу
NSArray *array = [[NSArray alloc] initWithContentsOfFile:path];

Исходный файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"  
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<array>
<dict>
    <key>nameKey</key>
    <string>Number One</string>
    <key>imageKey</key>
    <string>small_one.png</string>
</dict>
<dict>
    <key>nameKey</key>
    <string>Number Two</string>
    <key>imageKey</key>
    <string>small_two.png</string>
</dict>

</array>        
</plist>

Когда я попытался создать этот же файл выше в интерфейсе XCode, используя Add new File Property List, и после редактирования, поместив элемент таким же образом, как показано в интерфейсе для файла выше, метод [[NSArray alloc] initWithContentsOfFile:path]; завершился неудачей, и я нашелпроблема в структуре файла xml plist.Файл, созданный с использованием интерфейса XCode, приводит к xml plist-файлу:

<plist version="1.0">
<dict>
<key>item 0</key>
<dict>
    <key>imageKey</key>
    <string>image1.jpg</string>
</dict>
<key>item 1</key>
<dict>
    <key>imageKey</key>
    <string>image2.jpg</string>
</dict>
</dict>
</plist>

Я исправил прямое изменение в файле xml так же, как и в первом примере, и метод работает нормально.

Дело в интерфейсе XCode для plist-файла, вы не видите этих различий.Оба выглядят одинаково.Возможно это мой Xcode 4.1

0 голосов
/ 02 июня 2011

plist should start with Root Key

в вашем приложении необходимо изменить имя корневого ключа, так как он не может иметь тип данных

...