Как читать массив из 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"]];
Ответы
Ответ 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);