2010-08-25 34 views
43

Tiêu đề câu hỏi khá nhiều cho nó đi - Tôi muốn ứng dụng của tôi nhớ một vài điều. Đó là một số loại máy tính, do đó, nó nên lưu các giá trị được sử dụng cuối cùng và một số cài đặt người dùng có thể lựa chọn.Làm cách nào để lưu tùy chọn người dùng cho ứng dụng iPhone của tôi?

Về cơ bản tôi muốn lưu một số lượng nhỏ phao và BOOL và tải lại vào lần tải ứng dụng tiếp theo.

Cách tốt nhất và dễ nhất để làm điều đó là gì?

Cảm ơn !!

Trả lời

125

Một trong những cách dễ nhất sẽ được lưu nó trong NSUserDefaults:

Setting:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

[userDefaults setObject:value 
       forKey:key]; 
// – setBool:forKey: 
// – setFloat:forKey: 
// in your case 
[userDefaults synchronize]; 

Bắt:

[[NSUserDefaults standardUserDefaults] objectForKey:key]; 

– boolForKey: 

– floatForKey: trong trường hợp của bạn.

+0

Perfect! Cảm ơn! – Toastor

+1

'-setValue: forKey:' và '-valueForKey', tương ứng, cũng tốt. Hơn nữa, 'standardUserDefaults' luôn được sao lưu khi một iDevice được đồng bộ. Điều này thật tuyệt nếu bạn muốn bao gồm mua hàng trong ứng dụng. – SK9

+0

Cảm ơn làm việc hoàn hảo rất tốt –

6

Bên cạnh phương pháp tiếp cận NSUserDefaults rất tốt, có một cách dễ dàng khác để lưu trữ dữ liệu từ NSArray, NSDictionary hoặc NSData trong một tệp. Bạn có thể sử dụng những phương pháp cũng như:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 

tương ứng (đối với một NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path 

bạn chỉ cần đưa ra một đường dẫn hợp lệ đến một địa điểm. Theo Hướng dẫn lập trình ứng dụng iOS, thư mục/Library/Caches sẽ là nơi tốt nhất để lưu trữ dữ liệu mà bạn cần phải tồn tại giữa các lần khởi chạy ứng dụng. (Xem here)

Để lưu trữ/nạp một cuốn từ điển từ một đệ được gọi là "nhà quản lý" trong tài liệu của bạn directoy bạn có thể sử dụng các phương pháp:

-(void) loadDictionary { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //create a destination file name to write the data : 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 
    NSDictionary* panelLibraryContent = [NSDictionary dictionaryWithContentsOfFile:fullFileName]; 
    if (panelLibraryContent != nil) { 
     // load was successful do something with the data... 
    } else { 
     // error while loading the file 
    } 
} 

-(void) storeDictionary:(NSDictionary*) dictionaryToStore { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains 
    (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //make a file name to write the data to using the 
    //cache directory: 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 

    if (dictionaryToStore != nil) { 
     [dictionaryToStore writeToFile:fullFileName atomically:YES]; 
    } 
} 

Dù sao phương pháp này là rất hạn chế và bạn phải dành nhiều công sức hơn nếu bạn muốn lưu trữ dữ liệu phức tạp hơn. Trong trường hợp đó, API CoreData rất tiện dụng.

+0

Tùy chọn người dùng không thực sự là tài liệu. – SK9

+0

@ SK9: Tôi đã chỉ ra trong dòng đầu tiên rằng tôi chỉ hiển thị một giải pháp thay thế cho phương pháp NSUserDefaults. Không điều đó công bằng/cần thiết để bỏ phiếu một lựa chọn hợp lệ. – Chris

+2

ví dụ: Từ liên kết của bạn tới các tài liệu - "Nếu ứng dụng của bạn tạo các tệp dữ liệu lớn hoặc các tệp ** thay đổi thường xuyên **, bạn nên lưu trữ chúng trong thư mục Application Home/Library/Caches và không nằm trong thư mục /Documents Việc sao lưu các tệp dữ liệu lớn có thể làm chậm quá trình sao lưu một cách đáng kể.Điều này cũng đúng đối với các tệp thay đổi thường xuyên. – SK9

3

Trong Swift:

Thiết

let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setObject(value, forKey: key) 

// userDefaults.setFloat(12.34, forKey: "myFloatKey") 
// userDefaults.setBool(true, forKey: "myBoolKey") 

Lưu ý rằng cho iOS 8 và sau đó, gọi là userDefaults.synchronize()not recommended.

Bắt

let userDefaults = NSUserDefaults.standardUserDefaults() 
if let value = userDefaults.objectForKey(key) { 
    print(value) 
} 

Lưu ý rằng userDefaults.boolForKeyuserDefaults.floatForKey cả trở về giá trị không bắt buộc, vì vậy họ sẽ không bao giờ được nil (chỉ false hoặc 0.0).

Đọc thêm

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