如何从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);