Как добавить год и месяц в обратном отсчете Таймер Цель C - PullRequest
0 голосов
/ 12 февраля 2019

Прямо сейчас я добавил секунды и мин.в моем таймере.Кроме того, мне нужно добавить часы и месяц в моем таймере, как показано ниже:

enter image description here

Вот код, который я реализовал:

    // CountDown Timer
In My view DidLoad I have initialized my variables:
currHour = 1;
currMinute= 3;
currSeconds= 00;

-(void)start {
    timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];

}
-(void)timerFired {
    if((currHour>0 || currHour>=0) && (currMinute>0 || currSeconds>=0) && currMinute>=0) {

        if(currSeconds==0) {
            currMinute-=1;
            currSeconds=59;
        }
        else if(currSeconds>0) {
            currSeconds-=1;
        }
        if(currMinute>-1)
            [self.progress setText:[NSString stringWithFormat:@"%d%@%02d %@",currMinute,@":",currSeconds,@"Sec"]];
    }
    else {
        self.countDownView.hidden = TRUE;
        [timer invalidate];
    }
}  

Работает до минут и секунд.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Если вы используете метод NSTimer с блоком, вам не нужно хранить какие-либо переменные времени (или таймер в этом отношении), что довольно удобно:

- (void)startCountdownWithNumberOfSeconds:(NSTimeInterval)seconds {

    __block NSTimeInterval remainingTime = seconds;
    NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];

    [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer *timer) {

        NSDateComponents *components = [calendar components:(NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond)
                                                   fromDate:[NSDate date]
                                                     toDate:[NSDate dateWithTimeIntervalSinceNow:remainingTime--]
                                                    options:kNilOptions];
        NSLog(@"Remaining time: %@", components.description);

        if (remainingTime > 0) {
            self.progress.text = [NSString stringWithFormat:@"%02d:%02d:%02d:%02d", (int)components.day, (int)components.hour, (int)components.minute, (int)components.second];
        }
        else {
            [timer invalidate];
        }
    }];
}

NSCalendarимеет множество опций, например NSCalendarUnitYear и NSCalendarUnitMonth, так что вы можете просто добавить их в список, когда они вам понадобятся.

0 голосов
/ 12 февраля 2019

Добавьте к следующему коду viewDidLoad код и сохраните целевую дату как свойство или ivar

NSTimeInterval currentDateSeconds = [[NSDate date] timeIntervalSince1970];
NSTimeInterval targetDateSeconds = currentDateSeconds + [self secondsInDay:0 hour:1 min:3 sec:0];
targetDate = [NSDate dateWithTimeIntervalSince1970:targetDateSeconds];

, затем добавьте метод для преобразования целевой даты в секунды, например, в вашем примере это 1 час 3 минуты

- (NSTimeInterval) secondsInDay: (int) day hour:(int)hour min:(int)min sec: (int)sec {
NSTimeInterval secondsInOneDay = 24 * 60 * 60;
return day * secondsInOneDay + hour * 60 * 60 + min * 60 + sec; }

затем используйте следующий timeFired метод:

-(void)timerFired {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *dateComponents = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:[NSDate date] toDate:targetDate options:0];

NSInteger year = dateComponents.year;
NSInteger month = dateComponents.month;
NSInteger day = dateComponents.day;
NSInteger minute = dateComponents.minute;
NSInteger second = dateComponents.second;

if(year == 0 &&
    month == 0 &&
    day == 0 &&
    minute == 0 &&
   second == 0) {
    NSLog(@"FINISH");
    [timer invalidate];
} else {
    NSLog(@"%@", [NSString stringWithFormat:@"%d%@%02d %@",minute,@":",second,@"Sec"]);
}}
...