2010-11-10 74 views
11

你好 我開發小gameApp恢復的NSTimer。 我需要暫停計時器,當用戶轉到另一個視圖[說設置視圖]。 當用戶回到那個視圖時,我需要恢復定時器。如何暫停和iphone

有誰能夠解決這個問題...

在此先感謝...

回答

4

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

+0

謝謝,但我是iphone新手。你能否給我提供一些演示樣本,以便我可以輕鬆地通過它。 – 2010-11-11 04:47:12

+0

@JustSid,你能爲此提供示例代碼嗎?..我知道這已經過了幾年了,但對我來說,創建一個新的問題對我來說是多餘的。 :) – Pangu 2016-03-07 18:19:06

3

您不能暫停一個NSTimer。但是,您可以使其無效並在需要時創建一個新的。

+0

感謝,但我不能因爲無效時,我去另外的看法,回來那麼就應該從那裏被停止啓動。 – 2010-11-11 04:42:20

2
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]; 
7

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]; 
} 

這對我來說工作得非常好。

5

您可以使用此代碼來實現暫停和恢復功能中的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;好運

+1

好工作:) – MTahir 2014-05-11 14:19:15

0
- (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; 

} 
0

你最終想出來的?我看到你說過,當你進入另一個視圖時,你不能使你的計時器無效。你能解釋一下你的意思嗎? NSTimers不能被暫停,模擬暫停它們的方法通常會使它們失效。然後您可以通過創建一個新的定時器來模擬「解除暫停」,然後再重新啓動。這將模擬暫停和未暫停的計時器。

對於誰願意跟一個潛在的更方便的方法的人,我寫了一個控制器類,可以方便地處理暫停和取消暫停計時器。你可以在這裏找到它:https://github.com/LianaChu/LCPausableTimer

您可以使用,我寫來創建新的計時器控制器類,然後你可以暫停,並通過電話取消暫停計時器上的控制器類的方法「pauseTimer」和「unpauseTimer」。

我將不勝感激,怎麼樣,你使用它,什麼樣的變化,你想看看,或者你想我添加任何特徵的任何意見或建議。請不要猶豫,在這裏回覆您的意見,或張貼在Github頁面的問題標籤上。