2011-08-14 35 views
15

Gần đây, tôi là một học sinh trung học phổ thông và tôi quan tâm đến việc tạo ứng dụng cho iPhone. Gần đây, một trong các ứng dụng của tôi đã xuất hiện: NBlock. Đó là một ứng dụng câu đố và nó rất khó khăn. Tuy nhiên, nó có một vài vấn đề. Điểm số cao không được lưu. Tôi đã được yêu cầu sử dụng một plist. Có lời khuyên nào không?Cách sử dụng pList trong Lập trình iOS

+4

Bạn có thể bắt đầu bằng cách đọc [hướng dẫn plist của apple] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/QuickStartPlist/QuickStartPlist.html). – Jon7

Trả lời

12

URL phương pháp dựa cho việc này:

// Get the URL for the document directory 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
NSURL *documentDirectoryURL = [[fileManager URLsForDocumentDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0]; 

// Turn the filename into a string safe for use in a URL 
NSString *safeString = [@"scores.plist" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

// Create an array for the score 
NSMutableArray *array = [[NSMutableArray alloc] init];  
[array addObject:[NSNumber numberWithInt:score]]; 

// Write this array to a URL 
NSURL *arrayURL = [NSURL URLWithString:safeString relativeToURL:documentDirectoryURL]; 
[array writeToURL:arrayURL atomically:YES]; 
+1

Đối với tôi, có vẻ rõ ràng hơn và rõ ràng hơn khi sử dụng '- [NSURL URLByAppendingPathComponent:]' cho URL tệp thay vì URL tương đối. Điều này sẽ loại bỏ sự cần thiết cho phần trăm thoát khỏi đường dẫn và thường ít bị lỗi hơn. –

3

Tôi muốn tránh sử dụng plist. Cách dễ nhất để lưu dữ liệu đơn giản trong một ứng dụng, cho đến nay, là NSUserDefaults.

Khám phá this tutorial để biết hướng dẫn đơn giản về cách sử dụng NSUserDefaults. Luôn chắc chắn là synchronizeNSUserDefaults khi bạn viết xong cho họ.

Nếu bạn đang tìm kiếm một cách mạnh mẽ hơn (nhưng phức tạp hơn) để lưu dữ liệu, hãy xem hướng dẫn của Apple để sử dụng Core Data.

+0

Tôi nghĩ NSUserDefaults đã được đề xuất cho các cài đặt mặc định được chuẩn hóa mà bạn muốn tồn tại liên quan đến tùy chọn ngôn ngữ và các tùy chọn tương tự? – cheznead

2

Hãy xem NSKeyedArchiver/Unarchiver. Bạn có thể tiết kiệm khá nhiều thứ bạn muốn; NSUserDefaults, theo kinh nghiệm của tôi, đổ dữ liệu của bạn nếu bạn giết ứng dụng của bạn từ khay. Dữ liệu cốt lõi thực sự được sử dụng tốt hơn nếu bạn đang quản lý một lượng lớn dữ liệu với các cơ sở dữ liệu như sqlite.

+1

Tôi chưa bao giờ gặp vấn đề đó với 'syncize'd' NSUserDefaults' đúng cách. – mopsled

+1

Tôi sẽ xem xét điều đó, cảm ơn. NSUserDefaults thực sự chỉ tốt nếu bạn chỉ lưu một chuỗi đơn giản hoặc một cái gì đó tương tự (tôi đoán người hỏi có thể là một ứng cử viên tốt), miễn là nó có thể được lưu vĩnh viễn. –

+0

Kiểm tra liên kết tôi đã thêm vào trong câu trả lời của mình để xem cách giải quyết vấn đề đó. – mopsled

3

Heres những gì bạn muốn:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"scores.plist"]; 
NSMutableArray *array = [[NSMutableArray alloc] init];       
[array addObject:[NSNumber numberWithInt:score]];         
[array writeToFile:path atomically:YES]; 

Và để thêm điểm mới làm initWithContentsOfFile:@"scores.plist" thay vì init trong việc kê khai của array. Bạn có thể tùy ý sử dụng NSUserDefaults.

+1

Ai đó trên máy tính có thể định dạng mã nguồn trong bài viết của tôi không? Không thể trên ipod của tôi .... – JonasG

+0

+1. Có đáng để thêm phiên bản dựa trên URL này không? – Abizern

+0

Ý bạn là gì? 'writeToURL: tự động:'? – JonasG

0

tôi sẽ nói mã dưới đây sẽ làm việc và khá thẳng về phía trước trừ các kiểu dữ liệu đối tượng tùy chỉnh (một câu chuyện khác nhau của nó một lần nữa) được sử dụng:

NSString* plistPath = nil; 
NSFileManager* manager = [NSFileManager defaultManager]; 
if ((plistPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"PathTo.plist"])) 
    { 
    if ([manager isWritableFileAtPath:plistPath]) 
    { 
     NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; 
     [infoDict setObject:@"foo object" forKey:@"fookey"]; 
     [infoDict writeToFile:plistPath atomically:NO]; 
     [manager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[[NSBundle mainBundle] bundlePath] error:nil]; 
    } 
    } 

đặt thuộc tính ngày có thể hữu ích để kiểm tra khi nào là điểm thời gian cuối cùng được cập nhật.

Các vấn đề liên quan