2010-11-10 1 views
11

hello Я развиваю небольшую игруApp. Мне нужно приостановить таймер, когда пользователь перейдет в другой режим [скажем, окно настроек]. Когда пользователь возвращается к этому виду, мне нужно возобновить таймер.как приостановить и возобновить NSTimer в iphone

может кто-нибудь решить эту проблему ...

Спасибо заранее ...

ответ

4

Вы не можете приостановить таймер. Однако, когда пользователь переходит к представлению настроек, вы можете сохранить fireDate таймера, а также текущую дату. После этого вы аннулируете таймер и позволяете пользователю делать свои вещи. Как только он переключится на игру, вы создадите новый объект таймера и установите дату огня на старую дату огня плюс время, которое пользователь находился в меню (oldTime + currentTime).

+0

Спасибо, Но я новичок в iphone. можете ли вы предоставить мне образец демо, чтобы я мог легко пройти через него. –

+0

@JustSid, можете ли вы предоставить образец кода для этого? .. Я знаю, что это пара лет, но для меня лишний вопрос создать новый вопрос. :) – Pangu

3

Вы не можете приостановить NSTimer. Вы можете, тем не менее, аннулировать его и при необходимости создать новый.

+0

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

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; и in viewdidload pausetimeInterval = 0.0; удачи

+1

хорошая работа alok :) – MTahir

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.