2012-01-27 19 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であなたのcompSaveを呼び出す – Dmitry

+0

データが重要である正しいです - それは良いことだ)答えてくれてありがとう。 – Dmitry

+1

'synchronize'は正しい解決策です(私は確かに知っています、私は過去数年間にいくつかのプロジェクトでNSUserDefaultsを使っていました)あなたの問題は他の場所になければなりません。あなたはどこかの設定を上書きするでしょうか?たとえば、アプリケーションの起動時に誤って 'compServ'を' compLoad'の前に呼び出すと、再び「空の」値が返されます。 'compSave'と' compLoad'にブレークポイントを設定して、あなたのアプリケーションを起動するときに最初に呼び出されるものを見てください。 – DarkDust

6

ドキュメントによれば、次の呼び出しでは未解決の修正が残されます。これが成功したかどうかを確認するには、この呼び出しの戻り値を確認します。 YESの値は成功を示します。

[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

あなたはそれが失敗している方法の詳細を教えていただけますか?ユーザーのデフォルト値を設定して取得するコードが役に立ちますか? – wattson12

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オブジェクトは、永続ドメインの1つにある設定への変更を検出すると、この通知をアプリに送信します。この通知を使用して、ユーザーインターフェイスに影響する変更に対応することができます。たとえば、ユーザーの優先言語の変更を検出し、アプリコンテンツを適切に更新するために使用することができます。

設定を直接再読み込みする場合は、まだsynchronizeを使用する必要があります。

+0

すべての答えが役に立たなかった! – Dmitry

3

あなたAppDelegate

- (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'を呼び出しましたか? –

+0

変数を変更するたびに呼びます。 – Dmitry

関連する問題