2013-07-04 162 views
0

我倒计时直到午夜在我的应用程序。唯一的问题是倒数计时器总是关闭5分钟或更长时间。它从未真正关闭直到午夜的实际时间。我做了数学,我很确定它是正确的,但也许我犯了一个愚蠢的错误。倒计时器不准确

-(void) timerRun 
{ 
NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init]; 
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[formatterAmPm setDateFormat:@"a"]; 

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]]; 

secondsCount = secondsCount + 1; 
int hours = ((12*3600)-(secondsCount))/3600; 
int minutes = ((12*3600)-(secondsCount)-(hours*3600))/60; 
int seconds = ((12*3600)-(secondsCount)-(hours*3600))%60; 

NSString *timerOutput = [NSString stringWithFormat:@"%.2d:%.2d:%.2d", hours, minutes, seconds]; 
_countDownLabel.text = timerOutput; 

if ((secondsCount == 0) && ([amPmString isEqualToString:@"AM"])) 
{ 
    [_countdownTimer invalidate]; 
    _countdownTimer = nil; 
    MainViewController *ViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; 
    ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
    [self.navigationController pushViewController:ViewController animated:YES]; 
    self.sidePanelController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]]; 

} 
} 

-(void) setTimer 
{ 
NSDateFormatter *formatterHour = [[NSDateFormatter alloc] init]; 
[formatterHour setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[formatterHour setDateFormat:@"HH"]; 

NSDateFormatter *formatterMinute = [[NSDateFormatter alloc] init]; 
[formatterMinute setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[formatterMinute setDateFormat:@"mm"]; 

NSDateFormatter *formatterSecond = [[NSDateFormatter alloc] init]; 
[formatterSecond setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[formatterSecond setDateFormat:@"ss"]; 

NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init]; 
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]]; 
[formatterAmPm setDateFormat:@"a"]; 

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]]; 
NSString *hourString = [formatterHour stringFromDate:[NSDate date]]; 
NSString *minuteString = [formatterHour stringFromDate:[NSDate date]]; 
NSString *secondString = [formatterHour stringFromDate:[NSDate date]]; 

int hour = (([hourString intValue]) * 60 * 60); 
int minute = (([minuteString intValue]) * 60); 
int second = [secondString intValue]; 
if ([amPmString isEqualToString:@"PM"]) 
{ 
    stopTime = 12*60*60; 
} 
else 
{ 
    stopTime = 24*60*60; 
} 

secondsCount = hour + minute + second; 

secondsCount = secondsCount - stopTime; 

_countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self  selector:@selector(timerRun) userInfo:nil repeats:YES]; 
} 
+1

NSTimers并不是准确记录时间的手段,因为它们与运行循环相关。 – CodaFi

回答

2

NSTimer不准确,它会在适当的时候发射。这意味着你不能用它来计算秒数,因为你正在尝试。

相反,您需要做的是在您的timerRun方法中获取实际时间,并使用它来确定剩余秒数。您已致电[NSDate date]以获取AM/PM指示,只需使用它即可获取当前时间,然后再计算剩余秒数。