2012-07-16 3 views
5

Tôi sử dụng NSUserDefaults trong cài đặt của mình. Ứng dụng hoạt động tốt ngay cả khi tôi bấm phím chủ cho phép ứng dụng vào nền, nhưng nếu tôi giết ứng dụng, dữ liệu lưu trong NSUserDefaults sẽ bị mất. Đây là mã của tôi. Tôi đã sử dụng đồng bộ hóa. Các initialize Đầu tiên:Dữ liệu đã lưu bị mất sau khi xóa ứng dụng bằng NSUserDefaults

if (![userDefaults integerForKey: 
      kORFootageAirPlayModeKey]) 
    { 
     [userDefaults setInteger:TRUE forKey:kORFootageAirPlayModeKey]; 
    } 
    [userDefaults synchronize]; 

đọc giá trị trong một viewController:

airPlayMode = [[NSUserDefaults standardUserDefaults]integerForKey:kORFootageAirPlayModeKey]; 

Set nó trong một hành động:

- (IBAction)changeAirPlayStatus:(id)sender 
{ 

    if (sender) 
    { 
     airPlayMode = [sender tag]; 

     [[NSUserDefaults standardUserDefaults] setInteger:airPlayMode forKey:kORFootageAirPlayModeKey]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
..... 

}

Trả lời

1

Tôi không thấy một lý do cho điều đó.

Bạn đã kiểm tra trong thư mục Trình mô phỏng, trong Thư viện/Bộ nhớ có plist để lưu NSUserDefaults của bạn. Kiểm tra xem nó được viết chính xác chưa.

Và vui lòng không sử dụng setInteger: TRUE. Điều này là sai trên nhiều cấp độ. Sử dụng setBOOL: YES thay thế. Hoặc setInteger: 1.

+1

Sau khi tôi thay đổi setInteger thành setBOOL, mọi thứ đều chính xác. Vì vậy, lực lượng chuyển đổi cho ios điên. Và vị trí của tệp plist trong:/Users/apple/Library/Hỗ trợ ứng dụng/iPhone Simulator/5.1/Applications/xxxx-xxxxx-xxxxx/Library/Preferences/com.yourappname.plist –

1

Cách tốt nhất để đảm bảo rằng dữ liệu của bạn được lưu bao gồm một cuộc gọi đến -synchronize trong applicationWillTerminate: và trong applicationWillResignActive: trong ủy nhiệm ứng dụng của bạn.

Edit:

Ngoài ra, ý kiến ​​steipete về việc sử dụng setInteger: TRUE là accurate- sử dụng setBool: YES để thay thế.