2013-04-28 37 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

注意:我只想添加此信息,因爲我只看到初始化字典,然後獲取鍵的對象。希望它能幫助你們。