2012-09-02 62 views
0

我想解析來自plist文件的數據到NSMutableArray中。從NSMutableArray提取值的問題

以我的plist 根是含有的6號

我已經創建與IBOutlet中的UILabel * lbl4對象鉤住的標籤陣列的字典,我想此標籤以顯示陣列所作的第一元件閱讀plist。問題是程序在分配指令(最後一個)上崩潰。 我的代碼是這樣的:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docPath = [paths objectAtIndex:0]; 
NSString *plistPath = [docPath stringByAppendingPathComponent:@"settings.plist"]; 

if(![[NSFileManager defaultManager] fileExistsAtPath:plistPath]); 
{ 
    plistPath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"]; 
} 

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
NSString *err = nil; 
NSPropertyListFormat format; 

NSDictionary *temp = (NSDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&err]; 
if(!temp) 
{ 
    NSLog(@"Error reading plist: %@, format: %d", err, format); 
} 

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]]; 
[lbl4 setText:[NSString stringWithFormat:@"%@", [dataSet objectAtIndex:0]]]; 

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>Dadi</key> 
    <array/> 
    <key>D4</key> 
    <integer>0</integer> 
    <key>D6</key> 
    <integer>0</integer> 
    <key>D8</key> 
    <integer>0</integer> 
    <key>D10</key> 
    <integer>0</integer> 
    <key>D12</key> 
    <integer>0</integer> 
    <key>D20</key> 
    <integer>0</integer> 
</dict> 
</plist> 

調試輸出表示「2012-08-30 18:29:55.483信仰[6014:707] *終止應用程序由於未捕獲的異常「NSRangeException」,原因是:「* - [__ NSArrayM objectAtIndex:]:索引0超越界限空陣」」

+0

什麼是崩潰錯誤信息? –

+0

而且,你能顯示房產清單嗎? (隨意虛化任何實際的字符串) –

+0

添加plist和調試輸出的問題! –

回答

1

在你的plist,存儲在字典的Dadi鍵數組爲空!

<key>Dadi</key> 
    <array/> 

所以

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]]; 

集self.dataSet爲空數組(即偶數指數:0超出邊界)。

我會檢查se.f.dataSet.count == 0並在這種情況下提供一個默認值。

@ warrenm在評論中提到,你的plist的結構並不是你所期望的。這些都是XML文件,因此以/>結尾的任何標籤都是「自動關閉」的,因此總是爲空。爲了遏制這些數字,你需要添加一個結束標記,把它們裏面:

<array> 
    <integer>7</integer> 
</array> 

當然,在進一步評估,現有的plist與這些相關聯的密鑰,所以這也可能不是正確的解決方案。你需要評估你對plist的需求。

+0

我真的不知道爲什麼,但它的作品,現在我改變了這個plist中的源代碼(從教程複製): '{ \t大地=( \t \t 0, \t \t 0, \t \t 0, \t); }' 爲什麼現在它可以工作?這不是XML!這是什麼樣的plist以及它爲什麼起作用? –

+0

這是JSON,而不是plist(以爲它們幾乎100%兼容)。在JSON中,{}意味着object-> NSDictionary,而()意味着array-> NSArray。 –