如何从plist iOS中读取数组

我正在尝试读取包含数组的plist

    key1 value1 key2 value2 keyarray1  keyitem1 keyitem2    

当我尝试读取valueForKey:@“keyarray1”时,我得到null值。 我试着读作一个字符串和数组螺母没用。

我的代码

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

首先检查你的plist看起来像:

在此处输入图像描述

现在写下您访问plist的以下行

Objective-C的:

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

这是我工作窗口的完整屏幕截图(带日志输出):

在此处输入图像描述

迅速:

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

在此处输入图像描述

我知道这个问题太旧了,我只想为那些最近遇到此问题的人添加更多信息。

在我的例子中,我创建了一个plist作为Array(plist默认为Dictionary,键为“Root”)。

在此处输入图像描述

那么xml看起来像这样:

在此处输入图像描述

在我的视图控制器上,我直接初始化数组而不是初始化Dictionary然后获取关键字“Root”的对象:

在此处输入图像描述

注意:我只想添加此信息,因为我只看到初始化Dictionary然后获取键的对象。 希望它会帮助你们。

plist存放在哪里? 它是在应用程序包中吗? 如果是这样,你可能想使用[[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"]来获取路径,而不是硬编码@"values.plist"

正确地[values objectForKey:@"keyarray"]路径之后,您可以从字典中获取数组而不会出现任何问题,例如[values objectForKey:@"keyarray"]

最后注意: objectForKey:valueForKey:之间存在差异。 您当前正在使用valueForkey:它是NSKeyValueCoding一部分, NSKeyValueCoding是NSDictionary恰好符合的协议。 您应该使用objectForKey:或语法糖访问器,即dictionary[@"key"] ),因为它们是从字典访问值的正确方法。

你能试试下面的代码吗?

 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 ) 

斯威夫特4

与在Swift 4中一样,您可以使用codable和PropertyListDecoder

  func setData() { // location of plist file if let settingsURL = Bundle.main.path(forResource: "JsonPlist", ofType: "plist") { do { var settings: MySettings? let data = try Data(contentsOf: URL(fileURLWithPath: settingsURL)) let decoder = PropertyListDecoder() settings = try decoder.decode(MySettings.self, from: data) print("array is \(settings?.keyarray1 ?? [""])")//prints ["keyitem1", "keyitem2"] } catch { print(error) } } } } struct MySettings: Codable { var keyarray1: [String]? init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) keyarray1 = try values.decodeIfPresent([String].self, forKey: .keyarray1) } } 

有关更多信息,请参阅如何使用Swift 3 iOS应用程序阅读plist

尝试这个

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