0

我正在尝试在我的应用程序中添加一项功能,该功能允许用户将以美国格式 (MM/DD/YYYY) 显示的当前日期切换为英国格式 (DD/MM/YYYY) 并返回。

我正在使用分段控件在两个单独的计时器(dateTimer_us 和 dateTimer_uk)之间切换我的 UILabel(dateSlateLabel)。

我一切正常,但每当我切换到 dateTimer_uk 时,dateTimer_us 就会继续反击,就好像我没有杀死它一样。当我说反击时,我的意思是我看到英国格式和美国格式根据计时器的 timeInterval 来回闪烁。因此,由于我的计时器的 timeInterval 是 0.01,我看到美国格式快速闪烁而不是英国格式。我很清楚 dateTimer_us 没有被无效或其他东西正在启动它。当我切换到 dateTimer_us 时,一切似乎都很好,但问题恰恰相反(当我切换到 dateTimer_uk 时)。我认为我的代码/内存管理有问题,但我无法弄清楚。我已经在网上搜索并花了两天时间解决这个问题。

有任何想法吗?

注意:我试过只使用一个计时器和一个 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

你在这里展示的设计是不必要的复杂。一方面,您要求以百分之一秒的间隔更新代表当前时间的标签。这大约是发射频率的一百倍。

你的设计应该是这样的:

  • NSDateFormatter属性添加到您的视图控制器类。您无需公开此属性。
  • 在 viewDidLoad 中,
    • alloc/init您的NSDateFormatter财产到您想要的任何默认设置,美国或英国(您可以从NSUserDefaults.
    • 以 1 秒为间隔启动计时器,以调用更新标签的方法。此方法应使用该NSDateFormatter属性,无论它是什么值(该方法不关心)来呈现日期/时间
  • 在您的回调方法中切换时间格式,
    • releaseNSDateFormatter物业和alloc/init一个新的
  • 在 viewDidUnload 中,
    • invalidate/对象release_NSTimer
于 2010-12-20T02:04:08.000 回答