1

私のアプリでは、に保存するデータがたくさんありますNSUserdefaults。この情報は、NSObject( Object1)NSStringsNSNumbers、さらに別のオブジェクト (Object2) の 2 つのインスタンスで構成されます。多くの検索と試行の後、 と を使用してこのデータを正しく保存 (およびロード) しましNSCodingNSKeydArchiver

私のアプリのすべての画面は、基本的に、このデータモデルからの小さな情報のビューです。これらのビューの中にはデータを変更できるものがあるため、画面遷移の間にデータを保存してロードする必要があります。

私のスクリーンビューチェーンはこれです:ルート - >ビュー1 - >サブビュー1

ここに奇妙な部分があります:

サブビュー 1 では、データオブジェクトをロードしNSUserdefaultsて情報を表示します (これは機能します)。その後、ユーザーはデータを編集できます (この場合はNSString会社名を記述します)。ユーザーがトップバーの戻るボタンを押して「表示」に戻ると、 1" 保存をトリガーします (これも機能します)。

「View 1」に戻ると、viewWillAppearイベントがトリガーされます。このトリガーでは、保存したデータを「サブビュー 1」から再読み込みし、画面を再描画します (a UITableViewController)。ロード後、なぜか前画面での変更が反映されない!読み込まれたオブジェクトには、保存が行われなかった場合と同じ値が含まれています。

いくつかのログの後、ロードの前に保存を呼び出しても、後で実行されるようです。したがって、(デバッグ ブレークポイントによって) 確認されたアクションは、-> LOAD -> SAVE -> LOAD です。しかし、ログ機能(私は各セーブとロードの呼び出しをログに記録します)によれば、それは-> LOAD -> LOAD -> SAVEのようになります。

誰でもこれで私を助けることができますか?- ここで何が間違っているのかわかりません。

このコードは、必要に応じて作成したオブジェクトから呼び出され (時間内にシングルトンに置き換える必要があります)、保存およびロードされたデータに次のようにアクセスします。MyDataStoreObject.currentData

- (void) saveCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject: currentData];
    [defaults removeObjectForKey:@"MYAPP_CURRENTDATA"];
    [defaults setObject:data forKey:@"MYAPP_CURRENTDATA"];

    [defaults synchronize];
}

- (void) loadCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *data = [defaults objectForKey:@"MYAPP_CURRENTDATA"];

    if (data == nil)
    {
        currentData = nil;
        NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS");
    }
    else
    {
        currentData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
}
4

1 に答える 1

3

保存後にインスタンスでsynchronizeを呼び出しNSUserdefaultsて、保存したすべてのコンテンツが書き留められ、すぐに保持されるようにします。

編集:

ユーザーがトップバーの戻るボタンを押して「ビュー 1」に戻ると、保存がトリガーされます (これも機能します)。

どうやったの?戻るボタンが押されたことをキャッチするコードを見せてください。毎回保存を実行するかどうか興味があります。

于 2009-11-11T14:42:34.670 に答える