2013-04-28 72 views
23

我想读的plist数组,它包含数组如何读取plist中的iOS

<?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"]]; 
+0

您能告诉我们您的完整代码是否阅读plist? – Undo 2013-04-28 23:28:55

+0

我可以读取key1和key2,但不能读取数组。 – ram2013 2013-04-28 23:32:08

+0

发送ur plist的屏幕截图 – Naveen 2013-04-29 05:28:28

回答

63

首先检查您的plist样子:

enter image description here

现在写下面的行,你可以访问您的plist

Objectiv 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

斯威夫特:

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

enter image description here

+0

很好解释了答案! – 2015-01-20 13:36:32

3

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

正确地关闭了路径之后,就可以从字典中获取数组,而没有任何问题,例如[values objectForKey:@"keyarray"]

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

+0

我试过使用'objectforkey'但没用。 我的计数为0. – ram2013 2013-04-29 00:21:22

+0

如果您使用NSLog(@“values:%@”,values),会发生什么情况?有没有打印出来,或者,你看到“(null)”? – zadr 2013-04-29 05:13:25

+0

+1最后说明 – rptwsthi 2013-04-29 05:41:13

3

你可以试试下面的代码吗?

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 
) 
-1

试试这个

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

这是在应用程序包中查找项目路径的错误方法。基本上,不要认为它会是一个平坦的包。另外,当从NSDictionary访问值时,不应该使用'valueForKey:'。 – zadr 2013-04-29 05:12:02

+0

那么访问NSDictionary的值时应该使用什么? – Ravindhiran 2013-04-29 05:16:51

+0

'-objectForKey:'。在这个问题中看到我对@ ram2013的回答:http://stackoverflow.com/a/16269368/162361 – zadr 2013-04-29 05:17:56

5

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

在我的情况下,我创建了一个plist作为数组(plist的默认值是带有“Root”键的Dictionary)。

enter image description here

然后将XML看起来是这样的:

enter image description here

在我的视图控制器我直接初始化数组,而不是初始化字典然后得到对象键“根”:

enter image description here

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