簡體   English   中英

如何在iphone中暫停和恢復NSTimer

[英]how to pause and resume NSTimer in iphone

你好我正在開發小型gameApp。 當用戶進入另一個視圖[說設置視圖]時,我需要暫停計時器。 當用戶回到該視圖時,我需要恢復計時器。

任何人都可以解決這個問題......

提前致謝...

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; 祝好運

你不能暫停計時器。 但是,當用戶轉到設置視圖時,您可以保存計時器的fireDate以及當前日期。 在此之后,您使計時器無效並讓用戶執行他/她的工作。 一旦他/她切換回游戲,您將創建一個新的計時器對象,並將開火日期設置為舊的開火日期加上用戶在菜單中的時間(oldTime + currentTime)。

您無法暫停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無法暫停,模擬暫停它們的方法通常會使它們無效。 然后,您可以通過創建一個新的計時器來模擬“取消暫停”,然后再次啟動。 這將模擬暫停和取消暫停的計時器。

對於那些想要一個更方便的方法的人,我編寫了一個控制器類,可以方便地處理暫停和取消暫停的計時器。 你可以在這里找到它: https//github.com/LianaChu/LCPausableTimer

您可以使用我編寫的控制器類來創建新的計時器,然后您可以通過調用控制器類上的方法“pauseTimer”和“unpauseTimer”來暫停和取消暫停計時器。

我非常感謝您的任何評論或反饋,例如您如何使用它,您希望看到哪些更改,或者您希望我添加的任何功能。 請不要猶豫,在這里回復你的評論,或在Github頁面的問題標簽上發帖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM