试图切换2个NSTimers

时间:2010-12-20 01:31:53

标签: nstimer nsdateformatter uisegmentedcontrol invalidation

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

我正在使用段控件在两个不同的计时器(dateTimer_us& dateTimer_uk)之间切换我的UILabel(dateSlateLabel)。

我已经完成了所有工作,但每当我切换到dateTimer_uk时,dateTimer_us都会继续反击,就像我没有杀死它一样。当我说回击时,我的意思是我看到英国格式的美国格式根据计时器的timeInterval来回闪烁。所以,由于我的计时器'timeInterval是.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]];   

}

1 个答案:

答案 0 :(得分:0)

你在这里展示的设计是不必要的复杂。首先,您需要一个百分之一秒的间隔来更新代表当前时间的标签。这大约是发射的大约一百倍。

你的设计应该是这样的:

  • NSDateFormatter属性添加到视图控制器类。你不需要暴露 这个属性是公开的。
  • 在viewDidLoad中,
    • alloc / init您的NSDateFormatter媒体资源支持您想要的任何默认设置,美国或英国(您可以从NSUserDefaults读取/写入此偏好设置。
    • 以1秒的间隔启动计时器以调用方法来更新标签。此方法应使用NSDateFormatter属性,无论它是什么值(方法不关心)来呈现日期/时间
  • 在您的回调方法中切换时间格式,
    • release NSDateFormatter属性和alloc / init新的
  • 在viewDidUnload中,
    • invalidate / release NSTimer对象