0

ユーザーが米国形式(MM / DD / YYYY)で表示されている現在の日付を英国形式(DD / MM / YYYY)に切り替えたり、元に戻したりできる機能をアプリに追加しようとしています。

セグメントコントロールを使用して、UILabel(dateSlateLabel)を2つの別々のタイマー(dateTimer_usとdateTimer_uk)の間で切り替えています。

私はすべてが機能していますが、dateTimer_ukに切り替えると、dateTimer_usは、それを殺していないかのように反撃し続けます。私が反撃すると言うとき、私はタイマーのtimeIntervalに基づいてUSフォーマットが前後に点滅しているUKフォーマットを見ていることを意味します。タイマーのtimeIntervalが.01であるため、英国の形式よりも米国の形式がすばやく点滅します。dateTimer_usが無効にされていないか、他の何かがそれをバックアップし始めていることは私には明らかです。dateTimer_usに切り替えると、すべて問題ないように見えますが、その逆が問題です(dateTimer_ukに切り替えると)。コード/メモリ管理に問題があると思いますが、理解できません。私はウェブを精査し、この問題に2日間費やしました。

何か案は?

注:1つのタイマーとif elseを使用して、segmentControlステータスをチェックして日付形式を駆動しようとしましたが、機能しなかったようです。

これが私のコードです:

//////////////////////////////THIS CONTROLS THE DATE TIMER//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
- (IBAction)toggleDateFormat {

    if(dateFormatSegmentControl.selectedSegmentIndex == 0) {


        [dateTimer_uk invalidate];
        [dateTimer_uk release];
        dateTimer_uk = nil;

        [self dateTimer_us];


    }
    else if (dateFormatSegmentControl.selectedSegmentIndex == 1) {


        [dateTimer_us invalidate];
        [dateTimer_us release];
        dateTimer_us = nil;

        [self dateTimer_uk];


    }

}







-(void)dateTimer_us {

    dateTimer_us = [[NSTimer scheduledTimerWithTimeInterval: .01
                                                     target: self
                                                   selector: @selector(displayDate_us)
                                                   userInfo: nil
                                                    repeats: YES] retain];

}
-(void)displayDate_us; {

    NSDateFormatter *formatter =
    [[[NSDateFormatter alloc] init] autorelease];
    NSDate *date = [NSDate date];


    [formatter setDateFormat:@"MM/dd/yyyy"];
    [dateSlateLabel setText:[formatter stringFromDate:date]];



}
-(void)dateTimer_uk {


    dateTimer_uk = [[NSTimer scheduledTimerWithTimeInterval: .01
                                                     target: self
                                                   selector: @selector(displayDate_uk)
                                                   userInfo: nil
                                                    repeats: YES] retain];
}           
-(void)displayDate_uk; {

    NSDateFormatter *formatter =
    [[[NSDateFormatter alloc] init] autorelease];
    NSDate *date = [NSDate date];


    [formatter setDateFormat:@"dd/MM/yyyy"];
    [dateSlateLabel setText:[formatter stringFromDate:date]];   

}
4

1 に答える 1

0

ここに示したデザインは、不必要に複雑です。1つは、現在の時刻を表すラベルを更新するために100分の1秒の間隔を要求していることです。これは、発砲するには約100倍の頻度です。

デザインは次のようになります。

  • NSDateFormatterビューコントローラクラスにプロパティを追加します。このプロパティを公開する必要はありません。
  • viewDidLoadでは、
    • alloc/プロパティinitNSDateFormatter任意のデフォルト設定(米国または英国)に変更します(この設定はから読み取り/書き込みできますNSUserDefaults
    • 1秒間隔でタイマーを開始して、ラベルを更新するメソッドを呼び出します。このメソッドはNSDateFormatter、日付/時刻をレンダリングするために、値が何であれ(メソッドは関係ありません)、プロパティを使用する必要があります
  • 時間形式を切り替えるコールバックメソッドで、
    • releaseNSDateFormatterプロパティおよびalloc/init新しいもの
  • viewDidUnloadでは、
    • invalidate/オブジェクトrelease_NSTimer
于 2010-12-20T02:04:08.000 に答える