2012-01-06 13 views
8

Tôi tạo ra plist với cơ sở lớn của các loài động vật khác nhau trong đó (phím) và thêm plist này trong dự án của tôi. Loại của mỗi động vật là NSDictionary. Trong mỗi từ điển có thêm 5 khóa - đặc điểm của những con vật này(). Tôi muốn đi qua mọi con vật và nếu tôi phù hợp với một số đặc điểm của con vật này, tôi đặt con vật này vào một mảng khác.Đọc tập tin plist

Vì vậy, tôi đã cố gắng để làm cho một mã số:

NSArray *newArray = [[NSArray alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]];  

for (int i = 0;[newArray objectAtIndex:i];i++)  
{  
     if ([[newArray objectAtIndex:i]objectForKey:@"minAge"] == [NSNumber numberWithInt:3]) 
     {    
       [array addObject:[[newArray objectAtIndex:i]objectForKey:@"name"]];     
     } 
} 

Vì vậy objectAtIndex:i là một con vật và minAge là một trong những đặc điểm của nó. Nhưng mã của tôi không hoạt động. Tôi làm điều đó lần đầu tiên, vì vậy những gì tôi đã làm sai? Cảm ơn!

CẬP NHẬT: Cảm ơn bạn, plist của bạn hoạt động bình thường! Nhưng tôi vẫn không thể hiểu lý do tại sao không hoạt động của tôi plist: My plist was looking like this

Dù sao, cảm ơn bạn rất nhiều! Tôi không ăn và ngủ trong khi tôi giải quyết vấn đề này :) Bạn đã giúp tôi rất nhiều!

Trả lời

21

NSArray Giá trị Return sẽ bằng không nếu file không thể mở được hoặc nếu các nội dung của tập tin có thể không được phân tích thành một mảng.

tôi nghi ngờ vấn đề là bạn cần phải đặt nội dung trong một NSDictionary chứ không phải là một Edit.Further NSArray

NSDictionary *theDict = [NSDictionary dictionaryWithContentsOfFile:plistFile]; 

vào câu trả lời của tôi

NSMutableArray *mutableArray =[[NSMutableArray alloc] initWithObjects:nil]; 
NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]]; 

    //--get parent dictionary/Array named animals which holds the animals dictionary items 
    NSDictionary *parentDictionary = [mainDictionary objectForKey:@"animals"]; 


    //---enumerate through the dictionary objects inside the parentDictionary 
    NSEnumerator *enumerator = [parentDictionary objectEnumerator]; 
    id value; 

    while ((value = [enumerator nextObject])) { 
     if ([[value valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
     {    

      [mutableArray addObject:[value valueForKey:@"name"]];     
     } 


    } 

Nếu từ điển động vật không có trong của từ điển hoặc cụm từ mẹ hoặc, sử dụng một cái gì đó như thế này

NSMutableArray *mutableArray =[[NSMutableArray alloc] initWithObjects:nil]; 

    NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"animals" ofType:@"plist"]]; 




    //---enumerate through the dictionary objects 
    NSEnumerator *enumerator = [mainDictionary objectEnumerator]; 
    id value; 

    while ((value = [enumerator nextObject])) { 
     if ([[value valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
     {    

      [mutableArray addObject:[value valueForKey:@"name"]];     
     } 


    } 

Chỉnh sửa. 1.

Hãy thử với mẫu này. Đảm bảo bạn sử dụng trình chỉnh sửa văn bản thuần túy để dán vào và lưu dưới dạng tệp plist

Edit.2. Bây giờ tôi đã cập nhật plist của tôi để phù hợp với bạn. Mặc dù người kia làm việc. Tôi cảm thấy nó sẽ có ý nghĩa hơn rằng chúng tôi đang sử dụng như vậy.

<?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>Whale</key> 
    <dict> 
     <key>name</key> 
     <string>Whale</string> 
     <key>isMale</key> 
     <true/> 
     <key>color</key> 
     <string>blue</string> 
     <key>maxAge</key> 
     <integer>8</integer> 
     <key>minAge</key> 
     <integer>3</integer> 
    </dict> 
    <key>Dolphin</key> 
    <dict> 
     <key>maxAge</key> 
     <integer>20</integer> 
     <key>name</key> 
     <string>Dolphin</string> 
     <key>isMale</key> 
     <false/> 
     <key>color</key> 
     <string>blue</string> 
     <key>minAge</key> 
     <integer>15</integer> 
    </dict> 
</dict> 
</plist> 

Ngoài ra, đây là một ví dụ cho thấy làm thế nào để so sánh boolean và số cùng

NSMutableArray *theAnimalMatched =[[NSMutableArray alloc] initWithObjects:nil]; 


    NSDictionary *mainDictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data1" ofType:@"plist"]]; 



    //---enumerate through the dictionary objects inside the rootDictionary 
    NSEnumerator *enumerator = [mainDictionary objectEnumerator]; 
    id returnValue; 

while ((returnValue = [enumerator nextObject])) { 

     if ([[returnValue valueForKey:@"isMale" ] boolValue] && [[returnValue valueForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]] && [[returnValue valueForKey:@"color"] isEqualToString:@"blue"] ) 
     { 

     [theAnimalMatched addObject:[returnValue valueForKey:@"name"]];     
    } 


} 
+0

Cảm ơn bạn markhunte! Có, mảng trả về nil trong bảng điều khiển. Tôi đã thử mã của bạn nhưng nó cũng không hoạt động. Có lẽ tôi có vấn đề với tập tin plist của tôi? – Cosinus

+0

Tôi chỉ cần đặt một ví dụ plist trong câu trả lời của tôi. Hãy thử nó với điều đó. – markhunte

+0

Chà, nó hoạt động hoàn hảo! Cảm ơn bạn rất nhiều !Xin vui lòng, kiểm tra tin nhắn chính của tôi :) – Cosinus

0

Thay vì dòng sau

if ([[newArray objectAtIndex:i]objectForKey:@"minAge"] == [NSNumber numberWithInt:3]) 

hãy thử như sau

if ([[[newArray objectAtIndex:i]objectForKey:@"minAge"] isEqualToNumber:[NSNumber numberWithInt:3]]) 
+0

yees, cảm ơn! Tôi đã sửa nó rồi. Nhưng không may, nó không hoạt động. Tôi nghĩ rằng vấn đề của tôi gây ra bởi cái gì khác. – Cosinus