2010-07-05 3 views
3

Я пытаюсь сделать счетчик, который показывает количество дней, пока мы не отправимся в поездку в Европу. Это всего лишь около 70 дней (по состоянию на сегодняшний день), поэтому я не считаю, что мне нужно беспокоиться об астрономически больших количествах или чем-то еще, но я действительно в тупике - я прикрепил код, который мне дали некоторые друзья, Не работай. Поверьте мне, когда я говорю, что я пробовал все, что мог придумать, - и прежде чем кто-нибудь укусит мою голову, что я видел на этих форумах, да, я очень сильно смотрел на Apple Documentation, однако я не на 100% с чего начать - я пробовал NSTimer, NSDate и все их подклассы и методы, но тут ничего не выпрыгивает.Подсчитайте дни - iPhone Count Down Timer

С точки зрения того, что, на мой взгляд, я должен делать, я думаю, мне нужно каким-то образом назначить целочисленное значение для «дня» сегодня/сейчас/текущего дня, который будет динамически изменяться с помощью [NSDate date], а затем тот же на тот день, когда мы уходим. Обратный отсчет просто обновляется, когда метод снова вызван (я могу сделать это, используя NSTimer, если это необходимо), а значение, отображаемое на обратном отсчете, - это разница между этими двумя значениями.

Я не особо хочу иметь мерцающую вещь, которая обновляется каждую секунду, пока мы не уйдем - лично я думаю, что это липкий, но если кто-то знает, как тогда я буду благодарен за это в будущем.

Я также провел обширный поиск google, и я могу просто использовать неправильные поисковые запросы, но я ничего не могу найти.

Любая помощь очень ценится.

спасибо.

Michaeljvdw

- (void)countDownMethod { 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:startDay]; 
[comps setMonth:startMonth]; 
[comps setYear:startYear]; 
[comps setHour:startHour]; 

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
NSLog(@"%@",date); 
[gregorian release]; 
[comps release]; 
NSTimeInterval diff = [date timeIntervalSinceNow]; 

int diffInt = diff; 

NSString *days = [NSString stringWithFormat:@"%d",diffInt/86400]; 
day0.text = @"0"; 
day1.text = @"0"; 
day2.text = @"0"; 
NSLog(@"Days Length: %d",days.length); 

if(days.length >= 1){ 
    day2.text = [days substringFromIndex:days.length - 1]; 

    if(days.length >= 2){ 
     day1.text = [days substringWithRange:NSMakeRange(days.length - 2, 1)]; 

     if(days.length >= 3){ 
      day0.text = [days substringWithRange:NSMakeRange(days.length - 3, 1)]; 
     } 
    } 
} 

NSString *hours = [NSString stringWithFormat:@"%d",(diffInt%86400)/3600]; 
hour0.text = @"0"; 
hour1.text = @"0"; 
NSLog(@"Hours Length: %d",hours.length); 

if(hours.length >= 1){ 
    hour1.text = [hours substringFromIndex:hours.length - 1]; 

    if(hours.length >= 2){ 
     hour0.text = [hours substringWithRange:NSMakeRange(hours.length - 2, 1)]; 
    } 
} 
NSString *minutes = [NSString stringWithFormat:@"%d",((diffInt%86400)%3600)/60]; 
minute0.text = @"0"; 
minute1.text = @"0"; 
NSLog(@"Minutes Length: %d",minutes.length); 

if(minutes.length >= 1){ 
    minute1.text = [minutes substringFromIndex:minutes.length - 1]; 

    if(minutes.length >= 2){ 
     minute0.text = [minutes substringWithRange:NSMakeRange(minutes.length - 2, 1)]; 
    } 
} 

}

ответ

4

Если вы знаете время в секундах между 2 датами (ваш NSTimeInterval), то вы можете легко преобразовать его в строку, в дни формате: часы: мин: сек следующим образом.

- (NSString*)secsToDaysHoursMinutesSecondsString:(NSTimeInterval)theSeconds { 
div_t r1 = div(theSeconds, 60*60*24); 
NSInteger theDays = r1.quot; 
NSInteger secsLeftFromDays = r1.rem; 

div_t r2 = div(secsLeftFromDays, 60*60); 
NSInteger theHours = r2.quot; 
NSInteger secsLeftFromHours = r2.rem; 

div_t r3 = div(secsLeftFromHours, 60); 
NSInteger theMins = r3.quot; 
NSInteger theSecs = r3.rem; 

NSString* days; 
if (theDays < 10) { // make it 2 digits 
    days = [NSString stringWithFormat:@"0%i", theDays]; 
} else { 
    days = [NSString stringWithFormat:@"%i", theDays]; 
} 

NSString* hours; 
if (theHours < 10) { // make it 2 digits 
    hours = [NSString stringWithFormat:@"0%i", theHours]; 
} else { 
    hours = [NSString stringWithFormat:@"%i", theHours]; 
} 

NSString* mins; 
if (theMins < 10) { // make it 2 digits 
    mins = [NSString stringWithFormat:@"0%i", theMins]; 
} else { 
    mins = [NSString stringWithFormat:@"%i", theMins]; 
} 

NSString* secs; 
if (theSecs < 10) { // make it 2 digits 
    secs = [NSString stringWithFormat:@"0%i", theSecs]; 
} else { 
    secs = [NSString stringWithFormat:@"%i", theSecs]; 
} 

return [NSString stringWithFormat:@"%@:%@:%@:%@", days, hours, mins,secs]; 
} 
+0

Большое спасибо, это работает отлично. Очень признателен! – Michaeljvdw

2
//Another simple way to get the numbers of days difference to a future day from today. 

NSTimeInterval todaysDiff = [todayDate timeIntervalSinceNow]; 
NSTimeInterval futureDiff = [futureDate timeIntervalSinceNow]; 
NSTimeInterval dateDiff = futureDiff - todaysDiff; 

div_t r1 = div(dateDiff, 60*60*24); 
NSInteger theDays = r1.quot; 

label.text = [NSString stringWithFormat:@"%i", theDays];