Как сделать паузу и возобновить Nstimer в iPhone
-
30-09-2019 - |
Вопрос
Привет, я разрабатываю маленький Gameapp. Мне нужно приостановить таймер, когда пользователь переходит на другой вид [скажем, настроек]. Когда пользователь возвращается к этому представлению, мне нужно возобновить таймер.
Кто-нибудь может решить эту проблему ...
Заранее спасибо...
Решение
Вы не можете приостановить таймер. Тем не менее, когда пользователь переходит на представление настроек, вы можете сохранить fireDate
таймера, а также текущей даты. После этого вы недействители таймера и позвольте пользователю сделать его / ее вещи. Как только он / она переключается обратно в игру, вы создаете новый объект таймера и устанавливаете дату пожара на старую дату пожара плюс время, когда пользователь был в меню (OldTime + Treetime).
Другие советы
Nstimer не дает вам возможность приостановить ее. Однако с несколькими простыми переменными вы можете создать эффект самостоятельно:
NSTimer *timer;
double timerInterval = 10.0;
double timerElapsed = 0.0;
NSDate *timerStarted;
-(void) startTimer {
timer = [NSTimer scheduledTimerWithTimeInterval:(timerInterval - timerElapsed) target:self selector:@selector(fired) userInfo:nil repeats:NO];
timerStarted = [NSDate date];
}
-(void) fired {
[timer invalidate];
timer = nil;
timerElapsed = 0.0;
[self startTimer];
// react to timer event here
}
-(void) pauseTimer {
[timer invalidate];
timer = nil;
timerElapsed = [[NSDate date] timeIntervalSinceDate:timerStarted];
}
Это работает довольно хорошо для меня.
Вы можете использовать этот код для реализации паузы и возобновления функциональности в NSTIMER
//=========new timer update method=============
-(void) updateTimer {
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"mm:ss.S"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
NSString *timeString = [dateFormatter stringFromDate:timerDate];
lblMessage.text = timeString;
pauseTimeInterval = timeInterval;
}
-(IBAction) startBtnPressed:(id)sender
{
//=============================new update with start pause==================
if(running == NO) {
running = YES;
startDate = [NSDate date] ;
startDate = [[startDate dateByAddingTimeInterval:((-1)*(pauseTimeInterval))] retain];
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
}
else {
running = NO;
[stopWatchTimer invalidate];
stopWatchTimer = nil;
[self updateTimer];
}
}
Объявите в .h Файл NSDate StartDate;
NstimeInterval PausetimeInterval; и в ViewDidload PauseTimeInterval = 0,0; удачи
Вы не можете приостановить Nstimer. Вы можете, однако, однако, неиндивенны и создаете новый при необходимости.
on Start -
startNewCapture = [NSDate date];
on Pause -
captureSessionPauseDate = [NSDate date];
captureSessionTimeInterval = [captureSessionPauseDate timeIntervalSinceDate:startNewCapture];
on Resume -
NSDate *dateNow = [NSDate date];
startNewCapture = [NSDate dateWithTimeInterval:-captureSessionTimeInterval sinceDate:dateNow];
- (IBAction)pauseResumeTimer:(id)sender {
if (timerRunning == NO) {
timerRunning = YES;
[pauseTimerBtn setTitle:@"Resume" forState:UIControlStateNormal];
NSString *stringVal = [NSString stringWithFormat:@"%@",timeTxt.text];
stringVal = [stringVal stringByReplacingOccurrencesOfString:@":" withString:@"."];
float tempFloatVal = [stringVal floatValue];
int minuteValue = floorf(tempFloatVal);
float tempSecVal = [stringVal floatValue] - floorf(tempFloatVal);
int secondVal = tempSecVal*100;
minuteValue = minuteValue*60;
oldTimeValue = minuteValue + secondVal;
[timer invalidate];
timer = nil;
}
else
{
timerRunning = NO;
[pauseTimerBtn setTitle:@"Pause" forState:UIControlStateNormal];
startDate = [NSDate date];
timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
}
}
- (void)runTimer:(NSTimer *)timer {
NSInteger secondsAtStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:startDate];
secondsAtStart = secondsAtStart + oldTimeValue;
NSInteger seconds = secondsAtStart % 60;
NSInteger minutes = (secondsAtStart / 60) % 60;
NSInteger hours = secondsAtStart / (60 * 60);
NSString *result = nil;
result = [NSString stringWithFormat:@"%02ld:%02ld",(long)minutes,(long)seconds];
timeTxt.text = result;
}
Вы в конечном итоге выяснили это? Я видел, что вы сказали, что вы не можете сделать недействительным свой таймер, когда вы идете на другой вид. Можете ли вы объяснить, что вы подразумеваете под этим? Nstimers нельзя приостановить, а методы имитации приостановки их обычно включают в себя недействительные. Затем вы можете имитировать «Usausing», создав новый таймер, который затем запускается снова. Это сможет симулировать таймером приостановленным и непродовольственным.
Для людей, которые хотели бы потенциально более удобный метод, я написал класс контроллера, который может удобно обрабатывать паузы и затухания затусов. Вы можете найти это здесь: https://github.com/lianachu/lcpausabletimer.
Вы можете использовать класс контроллера, который я написал для создания новых таймеров, а затем вы можете приостановить и опровергать таймеры по вызове методов «PausEtimer» и «USAUSETIMER» на классе контроллера.
Я бы очень признателен за любые комментарии или отзывы, например, как вы использовали его, какие изменения вы хотели бы видеть, или любые функции, которые вы хотели бы добавить. Пожалуйста, не стесняйтесь отвечать с вашими комментариями здесь, или опубликовать вкладку «Вопросы» на странице GitHub.