2013-07-04 6 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 방법으로 실제 시간을 가져 와서 남은 시간 (초)을 확인하십시오. AM/PM 표시를 얻으려면 이미 [NSDate date]으로 전화하고 있습니다. 현재 시각을 얻으려면이 번호를 사용하고 남은 시간은 계산하십시오.