2012-01-27 38 views
2

是否可以立即在iPhone上存儲設置? iOS 4+上的應用程序在退出時不會關閉,如果在Xcode設置中按下「停止進程」不會保存?如何保存它們?如何立即在iPhone上存儲設置?

- (void)compLoad { 
    compTotal = [[NSUserDefaults standardUserDefaults] integerForKey: @"compTotal"]; 
    compCount = [[NSUserDefaults standardUserDefaults] integerForKey: @"compCount"]; 
    compShow = [[NSUserDefaults standardUserDefaults] boolForKey: @"compShow"]; 
} 

- (void)compSave { 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
} 

回答

7
- (void)compSave 
{ 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
2

只需致電[[NSUserDefaults standardUserDefaults] synchronize];。但通常你會做而不是需要這樣做:一旦你的應用程序進入後臺以及其他一些場合,iOS將會保存。過於頻繁地調用synchronize被認爲是一件壞事(tm)。

+0

是NSUserDefaults的正確 – Dmitry 2012-01-27 14:31:37

+0

是數據是很重要的 - 這是一件好事),感謝您的回答。 – Dmitry 2012-01-27 14:34:46

+1

由於'synchronize'是正確的解決方案(我確實知道,過去幾年我在幾個項目中使用了NSUserDefaults),您的問題必須在其他地方。也許你會在某處覆蓋你的設置?例如,如果您在應用程序啓動時在'compLoad'之前不小心調用'compSave',則會再次獲得「空」值。在'compSave'和'compLoad'上設置一個斷點,並查看啓動應用程序時首先調用哪個斷點。 – DarkDust 2012-01-27 15:14:23

6

根據文檔,以下調用將持續任何未完成的修改。要檢查這是否成功,請檢查此調用的返回值。值爲YES表示成功。

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

你可以提供關於它如何失敗的更多信息嗎?你設置和獲取用戶默認值的代碼可能有幫助嗎? – wattson12 2012-01-27 14:52:49

1

嘗試使用synchronize方法。

更新:你應該考慮註冊您的默認值,就像它表明在Preferences and Settings Programming Guide

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Register the preference defaults early. 
    NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"CacheDataAgressively"]; 
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

    // Other initialization... 
} 

此外,從本指南( 「同步檢測偏好的變化」),關於同步:

要檢測對首選項值的更改何時發生,應用程序還可以註冊通知NSUserDefaultsDidChangeNotification。只要共享的NSUserDefaults對象檢測到位於其中一個持久域中的首選項發生更改,它就會將此通知發送到您的應用程序。您可以使用此通知來響應可能影響用戶界面的更改。例如,您可以使用它來檢測用戶首選語言的更改並適當地更新您的應用內容。

很確定你仍然需要使用synchronize如果你想直接重新讀取設置。

+0

所有的答案沒有幫助! – Dmitry 2012-01-27 14:37:02

3

打電話給你compSaveAppDelegate

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
    // Call your compSave here to force saving before app is going to the background 
} 

- (void)compSave 
{ 
    [[NSUserDefaults standardUserDefaults] setInteger: compTotal forKey: @"compTotal"]; 
    [[NSUserDefaults standardUserDefaults] setInteger: compCount forKey: @"compCount"]; 
    [[NSUserDefaults standardUserDefaults] setBool: compShow forKey: @"compShow"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+0

您是否在上面提到的AppDelegate方法中調用了您的'compSave'? – 2012-01-27 14:38:07

+0

我在每個變量改變後都會調用它。 – Dmitry 2012-01-27 14:43:40