2013-04-28 22 views
23

Tôi cố gắng để đọc plist trong đó có mảngLàm thế nào để đọc Mảng từ iOS 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>key1</key> 
<string>value1</string> 
<key>key2</key> 
<string>value2</string> 
<key>keyarray1</key> 
<array> 
    <string>keyitem1</string> 
    <string>keyitem2</string> 
</array> 
</dict> 
</plist> 

khi tôi cố gắng đọc valueForKey: @ "keyarray1", tôi nhận được giá trị null. Tôi đã cố gắng đọc như một chuỗi và mảng hạt không sử dụng.

Mã My

NSDictionary * values=[[NSDictionary alloc] initWithContentsOfFile:@"values.plist"]; 
NSArray *arrayValues=[[NSArray alloc] initWithArray:[values valueForKey:@"keyarray1"]]; 
+0

Bạn có thể hiển thị cho chúng tôi mã đầy đủ của bạn để đọc định dạng không? – Undo

+0

Tôi có thể đọc key1 và key2 nhưng không thể đọc mảng. – ram2013

+0

gửi một ảnh chụp màn hình của ur plist – Naveen

Trả lời

63

Trước hết Kiểm tra plist của bạn trông giống như:

enter image description here

Bây giờ viết dòng sau nơi bạn đang truy cập vào plist của bạn

Objectiv C:

NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Values" ofType:@"plist"]]; 
NSLog(@"dictionary = %@", dictionary); 
NSArray *array = [dictionary objectForKey:@"keyarray1"]; 
NSLog(@"array = %@", array); 

Dưới đây là ảnh chụp toàn màn hình (với sản lượng log) của cửa sổ làm việc của tôi:

enter image description here

Swift:

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

Câu trả lời hay được giải thích !! –

3

đâu là plist lưu trữ? Có trong gói ứng dụng không? Nếu có, bạn có thể muốn sử dụng [[NSBundle mainBundle] pathForResource:@"values" ofType:@"plist"] để lấy đường dẫn, thay vì mã hóa cứng @"values.plist".

Sau khi bạn có đường dẫn xuống chính xác, bạn có thể lấy mảng từ từ điển mà không gặp bất kỳ sự cố nào, với một cái gì đó như [values objectForKey:@"keyarray"].

Lưu ý cuối cùng: có sự khác biệt giữa objectForKey:valueForKey:. Bạn hiện đang sử dụng valueForkey: là một phần của NSKeyValueCoding, một giao thức mà NSDictionary xảy ra để tuân thủ. Bạn nên sử dụng objectForKey: (hoặc cú pháp đường dẫn truy cập, tức là dictionary[@"key"]) thay vào đó, vì đó là cách thích hợp để truy cập giá trị từ từ điển.

+0

Tôi đã cố gắng sử dụng 'objectforkey' nhưng không sử dụng. Tôi nhận được số là 0, – ram2013

+0

Điều gì xảy ra nếu bạn 'NSLog (@" values:% @ ", values);'? Có điều gì được in ra, hoặc, bạn có thấy "(null)" không? – zadr

+0

+1 cho lưu ý cuối cùng – rptwsthi

3

Bạn có thể thử mã sau không?

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

tôi đã sau đầu ra trong nhật ký: -

arrayValues = (
    keyitem1, 
    keyitem2 
) 
-1

Hãy thử điều này

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

Đây là cách sai để tìm đường dẫn của một mục trong gói ứng dụng. Đừng cho rằng nó sẽ là một gói phẳng, về cơ bản. Ngoài ra, bạn không nên sử dụng 'valueForKey:' khi truy cập các giá trị từ NSDictionary. – zadr

+0

thì tôi nên sử dụng những gì khi truy cập các giá trị từ NSDictionary? – Ravindhiran

+0

'-objectForKey:'. Xem câu trả lời của tôi cho @ ram2013 trong câu hỏi này: http://stackoverflow.com/a/16269368/162361 – zadr

5

Tôi biết câu hỏi này quá cũ và tôi chỉ muốn thêm thông tin cho những người gặp phải điều này gần đây.

Trong trường hợp của tôi, tôi đã tạo một plist là Array (mặc định plist là Dictionary with key "Root").

enter image description here

thì xml trông như thế này:

enter image description here

On khiển quan điểm của tôi tôi khởi tạo trực tiếp các mảng thay vì khởi tạo các từ điển sau đó nhận được đối tượng cho khóa "Root":

enter image description here

Lưu ý: Tôi chỉ muốn thêm thông tin này vì tôi chỉ thấy khởi tạo từ điển rồi lấy đối tượng cho các phím. Hy vọng nó sẽ giúp các bạn.