NSTimer的奇怪行为

时间:2015-03-09 12:44:41

标签: ios xcode6 nsdate nstimer uidatepicker

  

首先,这是我无法实现的目标:

我想从timerCurrent date and Time运行user Selected Date and Time

  

我做了什么:

  • IBOutlet DatePicker
  • 制作一个UIButton
  

我尝试过:

- (IBAction)schedulePostTapped:(id)sender
{

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateCountdown:) userInfo:nil repeats:YES];
}

- (void)updateCountdown:(NSTimer *)timer
{
NSDate *startingDate = [chooseDate date];


NSDate *endingDate = [NSDate date];

double secondsTime = [endingDate timeIntervalSinceDate:startingDate];


NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0];

NSInteger hours    = [dateComponents hour];
NSInteger minutes  = [dateComponents minute];
NSInteger seconds  = [dateComponents second];
NSString *countdownText = [NSString stringWithFormat:@"%ld Hours %ld Minutes %ld Seconds",(long)hours, (long)minutes, (long)seconds];
self.statusLabel.text = countdownText;

NSLog(@"%@",[NSString stringWithFormat:@"%f",secondsTime]);

    if (secondsTime==0) {
        [timer invalidate];
        timer = nil;
    }

   }
  

我遇到的问题:

  • 每当我选择一个时间,即使在当前时间后一分钟,也会在计时器中随机添加一些额外的秒数。我无法弄明白。

Example

**延迟必须是1m04Sec,但它显示我1m55Sec **

2 个答案:

答案 0 :(得分:1)

每秒钟都没有定时器文件,并且在启动定时器后不要求结束时间。

从用户获取结束时间,然后使用initWithFireDate:启动未来日期的计时器。您必须使用addTimer:forMode:将新计时器添加到运行循环中。在触发时,计时器将消息aSelector发送到目标。

节省他们触摸按钮的时间。通过将选定的持续时间添加到保存的时间来计算开火时间。

对于文档添加方法调用,参数无关紧要,单击initWithFireDate并阅读“快速帮助检查器”中的文档

enter image description here

答案 1 :(得分:0)

请注意,模60,-55与5一致。看起来你向后计算的事实可能会让人感到困惑。看看这个:

NSDate *startingDate = [chooseDate date];
NSDate *endingDate = [NSDate date];

因此endingDate是第二行执行的当前时间,而startingDate是选择器中选择的时间(在您的示例中将来)。当您根据日历计算差异时......

NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:startingDate toDate:endingDate options:0];

您的分钟数似乎为-1,秒数为-55。尝试通过在上面的方法调用中切换startingDateendingDate的位置,或者通过交换分配给它们的值来转过来。我认为这会让你获得更直观的结果。