2012-06-03 3 views
2

Я пытаюсь прочитать файл Plist в NSArray с использованием initWithContentsOfFile, как описано hereNSArray initWithContentsOfFile возвращает ноль

Мой код выглядит следующим образом

NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *plistPath = [bundle pathForResource: 
          @"routes" ofType:@"plist" ]; 
    routes = [[NSArray alloc] initWithContentsOfFile:plistPath ]; 
    NSLog:(@"contents of myArray %@", routes); 

routes.plist имеет совершенно простую структуру массива и 2 строки значения внутри

<?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"> 
<dict> 
    <key>Root</key> 
    <array> 
     <string>1</string> 
     <string>2</string> 
    </array> 
</dict> 
</plist> 

This is how it looks in xcode

Все кажется прекрасным. plistPath инициализируется с правильным значением, что означает, что файл копируется в комплект и может быть прочитан. Но routes = [[NSArray alloc] initWithContentsOfFile:plistPath ]; возвращает 0x0 значение. Я думаю, что это равно nil

Что не так с моим кодом?

ответ

8

На самом деле ваш plist - это словарь.

Изменить это:

<dict> 
    <key>Root</key> 
    <array> 
     <string>1</string> 
     <string>2</string> 
    </array> 
</dict> 

к этому:

<array> 
    <string>1</string> 
    <string>2</string> 
</array> 
+1

Человек, ты прав. Но в визуальном редакторе Xcode я выбрал тип массива! Смотрите скриншот, который я добавил. Это ошибка Xcode4? –

+0

Nope. У вас есть объект массива с ключом с именем «Root» (который отдает, что ваш plist является «NSDictionary'»). Вы можете добавить дополнительные объекты на этом уровне с разными именами ключей. –

+1

Но выбора нет, Xcode создает dict по умолчанию, и вы не можете его изменить в визуальном редакторе. Только путем редактирования plist в качестве исходного файла. Но хорошо, теперь я знаю об этом. Благодаря! –

2

Я думаю, что вы хотите сделать что-то вроде этого:

NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource: 
         @"routes" ofType:@"plist"]; 

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
NSArray *routes = [dictionary objectForKey:@"Root"]; 
Смежные вопросы