0

「タイムスタンプ」というクラスがあります。このクラスには、アプリstatic NSDateを開いて最初に初期化される変数が含まれています。NSUserDefaultsこの日付は、後で使用される文字列に変換されます。これは私が最初に日付を設定する方法です:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *string = [defaults objectForKey:@"timestampCheck"];

if (!string) { 

    Timestamp *tstamp = [[Timestamp alloc] init];
    [tstamp setSingleTimeStamp : [NSDate date]];
    [tstamp release];

    [defaults setObject:@"notFirst" forKey:@"timestampCheck"];
    [defaults synchronize];

} else {

    Timestamp *ti = [[Timestamp alloc] init];
    [ti initializeTimestamp];
    [ti release];

}

initializeTimestamp 

メソッドは、デフォルトからタイムスタンプを取得するだけです。これは、次のメソッドで設定されます。synchronizeTimestamp

このメソッドは、アプリがバックグラウンド状態になったときに呼び出されます。

Timestamp クラスは次のようになります。

    - (void)setSingleTimeStamp:(NSDate *)dateProvided {

    date = dateProvided;
    [date retain];
}

- (void)synchronizeTimestamp {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:date forKey:@"timestampDate"];

    [defaults synchronize];

}

- (void)initializeTimestamp {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    date = [defaults objectForKey:@"timestampDate"];

}

- (NSString *)dateStringContainer {


    NSDate *tempDate = date; 

    unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [calendar components:units fromDate:tempDate];

    NSInteger year = [components year];
    NSInteger month = [components month];
    NSInteger day = [components day];

    return [NSString stringWithFormat:@"%i - %i - %i", day, month, year]; 

}

別のビュー コントローラーのラベルのテキストは に設定されdateStringContainerます。もちろん、アプリを削除してビルドすると、正しい日付が表示されます。しかし、アプリを終了してマルチタスク バーから削除すると、ラベル テキストは次のようになります。

1 - 1 - 2001

そしてdate、いくつかの後にゼロですNSLog's

アップデート:

基本的に、アプリがプラグインされているときに、アプリが初めて開いたときに日付が機能します(これを行うには、毎回アプリを削除する必要があります)。しかし、マルチタスクバーから削除した後に戻ったとき、日付が正しくありません。NSUserDefaultsこれは、私のコードに何か問題があるということですよね? 推測するだけで...

編集:

synchronizeTimestamp メソッドが呼び出されていないことに気付きました。しかし、それは Xcode でアプリを停止しているためかもしれません。Xcode でそのアプリを停止すると、バックグラウンド モードになりますか?

4

2 に答える 2

1

次のものを保持する必要があります。

date = [defaults objectForKey:@"timestampDate"];

どれであるべきか

date = [[defaults objectForKey:@"timestampDate"] retain];

デフォルトでは自動解放されたオブジェクトが返されるため、これですべての問題が解決するかどうかはわかりませんが、これは確かにバグです

于 2012-06-03T13:17:46.157 に答える
0

わかりましたので、問題は私のコードではありませんでした! Xcodeでアプリを停止したのは私でした。その結果、に保存されてapplicationDidEnterBackground:いる場所を呼び出しません。データの保存をテストするのが難しくなるので、これは良くないと思いますよね? したがって、私が見つけた最も簡単な解決策は、メソッドで に同期することでした: ... ユーザーが以前のコードで iPhone の日付を表示する可能性が高いことは理解していますが、リスクを冒さない方がよいでしょう。dateNSUserDefault'sNSUserDefaultsviewWillDisappear

于 2012-06-04T09:40:38.070 に答える