0

Application Delegate didFinishLaunchingメソッドでは、次のコードを使用して、ユーザーの新しい設定バンドルとして使用される新しいNSDictionaryを構築しています。

NSNumber *testValue = (NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"settingsversion"];
if (testValue == nil)
{
    NSNumber *numNewDB = [NSNumber numberWithBool:NO];
    NSNumber *numFirstUse = [NSNumber numberWithBool:YES];
    NSDate *dateLastStatic = [NSDate date];
    NSDate *dateLastMobile = [NSDate date];
    NSNumber *numSettingsversion = [NSNumber numberWithFloat:1.0];

    NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                 numNewDB, @"newdb",
                                 numFirstUse, @"firstuse",
                                 numSettingsversion, @"settingsversion",
                                 dateLastStatic, @"laststaticupdate",
                                 dateLastMobile, @"lastmobileupdate",
                                 nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

後で別のViewControllerで、NSUserDefaultsとして保存された同じディクショナリから値を読み戻そうとしています-少なくともそうなると思いましたが、目的のメンバーlastUpdateの有効なオブジェクトポインタがそこにありません:

.hファイル内:

NSDate *lastUpdate;

メンバー関数の.mファイル内:

lastUpdate = (NSDate *)[[NSUserDefaults standardUserDefaults] objectForKey:@"laststaticupdate"];

[NSUserDefaults standardUserDefaults]のコンテンツを印刷しても、次のようにしか表示されません。

2010-04-29 15:13:22.322 myApp[4136:207] Content of UserDefaults: <NSUserDefaults: 0x11d340>

これにより、メモリ内のどこかにstandardUserDefaultsディクショナリがないか、そのような構造として判別できないという結論に至ります。

編集:毎回、デバイスでアプリを再起動します。testValueのチェックはNilで、辞書を再度作成していますが、1回実行すると、電話で永続化されるはずです。

私はその間のどこかで何か間違ったことをしていますか?iPhoneの特定のアプリケーションの設定を永続的にロードして保存する方法をまだよく理解していないように感じます。

これに加えて私がしなければならないことはありますか?XCodeにsettings.bundleを統合するか、辞書を手動でDocumentsフォルダーに保存しますか?

誰かがここで私を助けてくれますか?どうもありがとう!

4

1 に答える 1

0

registerDefaults実際にはディスクに何も書き込みません。メモリ内に「デフォルト デフォルト」ディクショナリを作成するだけです。したがって、アプリを再起動するたびに、testValue は nil になるはずです。

永続的な値を設定する場合は、 を使用しますsetObject:forKey:

ただし、有効なオブジェクトが返されない理由はわかりません。

于 2010-04-29T13:39:20.183 に答える