Подтвердить что ты не робот

Как читать массив из plist iOS

Я пытаюсь прочитать plist, который содержит массив

<?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>key1</key>
<string>value1</string>
<key>key2</key>
<string>value2</string>
<key>keyarray1</key>
<array>
    <string>keyitem1</string>
    <string>keyitem2</string>
</array>
</dict>
</plist>

когда я пытаюсь прочитать valueForKey: @ "keyarray1", я получаю нулевое значение. Я пытался читать как строку и гайку без использования.

Мой код

NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:@"values.plist"];
NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]];
4b9b3361

Ответ 1

Прежде всего, проверьте, что ваш plist выглядит следующим образом:

enter image description here

Теперь напишите следующие строки, где вы обращаетесь к своему plist

Объектив C:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Values" ofType:@"plist"]];
NSLog(@"dictionary = %@", dictionary);
NSArray *array = [dictionary objectForKey:@"keyarray1"];
NSLog(@"array = %@", array);

Вот полный снимок экрана (с выходом журнала) моего рабочего окна:

enter image description here

Swift:

let dictionary = NSDictionary(contentsOfFile: Bundle.main.pathForResource("Values", ofType: "plist")!);
let array = dictionary?["arrayKey"] as! NSArray
print("dictionary=",  dictionary, "\narray =",  array)

введите описание изображения здесь

Ответ 2

Я знаю, что этот вопрос слишком стар, и я просто хочу добавить дополнительную информацию для тех, кто сталкивается с этим недавно.

В моем случае я создал plist как Array (plist default - Словарь с ключом "Root" ).

enter image description here

то xml выглядит так:

enter image description here

В моем контроллере просмотра я инициализирую непосредственно Array вместо инициализации Словаря, а затем получаю объект для ключа "Root":

enter image description here

Примечание. Я только хотел добавить эту информацию, так как я вижу только инициализацию словаря, а затем получаю объект для ключей. Надеюсь, это поможет вам, ребята.

Ответ 3

Где хранится plist? Это в комплекте приложений? Если это так, вы, вероятно, захотите использовать [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"], чтобы получить путь, а не hardcoding @"values.plist".

После правильного пути вы можете получить массив из словаря без каких-либо проблем, с чем-то вроде [values objectForKey:@"keyarray"].

Заключительное примечание: существует разница между objectForKey: и valueForKey:. В настоящее время вы используете valueForKey:, который является частью NSKeyValueCoding, протокола, которому NSDictionary соответствует. Вместо этого вы должны использовать objectForKey: (или синтаксические аксессоры сахара, т.е. dictionary[@"key"]), поскольку они являются надлежащими способами доступа к значению из словаря.

Ответ 4

Можете ли вы попробовать следующий код?

NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"];
NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:plistPath];
NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]];
NSLog(@"arrayValues = %@",arrayValues);

Я получил следующий результат в журнале: -

arrayValues = (
    keyitem1,
    keyitem2
)

Ответ 5

Попробуйте это

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"values.plist"];
NSMutableDictionary *dict =[NSMutableDictionary dictionaryWithContentsOfFile:finalPath];
NSArray *arr =[dict valueForKey:@"keyarray1"];
NSLog(@"%@",arr);