2010-11-10 48 views
11

hello Tôi đang phát triển gameApp nhỏ. Tôi cần tạm dừng hẹn giờ, khi người dùng chuyển sang chế độ xem khác [nói chế độ xem cài đặt]. khi người dùng quay lại chế độ xem đó, tôi cần phải tiếp tục hẹn giờ.cách tạm dừng và tiếp tục NSTimer trong iphone

ai cũng có thể giải quyết vấn đề này ...

Cảm ơn trước ...

Trả lời

4

Bạn không thể tạm dừng bộ hẹn giờ. Tuy nhiên, khi người dùng chuyển sang chế độ xem cài đặt, bạn có thể lưu fireDate của bộ hẹn giờ và cũng là ngày hiện tại. Sau đó, bạn sẽ vô hiệu hóa bộ hẹn giờ và cho phép người dùng thực hiện công việc của mình. Khi anh ta/cô ấy chuyển về trò chơi, bạn tạo một đối tượng bộ đếm thời gian mới và đặt ngày tháng cháy thành ngày cháy cũ cộng với thời gian người dùng ở trong menu (oldTime + currentTime).

+0

Cảm ơn, nhưng tôi mới làm quen với iphone. bạn có thể cung cấp cho tôi một số mẫu demo để tôi có thể dễ dàng trải qua nó không. –

+0

@JustSid, bạn có thể cung cấp mã mẫu cho điều này không? .. Tôi biết đây là một vài năm tuổi, nhưng nó dư thừa cho tôi để tạo ra một câu hỏi mới về điều này. :) – Pangu

3

Bạn không thể tạm dừng một NSTimer. Tuy nhiên, bạn có thể vô hiệu hóa nó và tạo một cái mới khi cần thiết.

+0

Cảm ơn Nhưng tôi không thể làm mất hiệu lực vì khi tôi đến một chế độ xem khác và quay lại thì nó sẽ bắt đầu từ nơi nó đang dừng. –

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 không cung cấp cho bạn khả năng tạm dừng nó. Tuy nhiên, với một vài biến đơn giản, bạn có thể tự tạo hiệu ứng:

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

Điều này đã làm việc khá tốt cho tôi.

5

bạn có thể sử dụng mã này để thực hiện tạm dừng và tiếp tục chức năng trong 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]; 
} 
} 

tuyên bố trong file .h NSDate STARTDATE;

NSTimeGiá trị tạm dừngThời gian chờ; và trong viewdidload pauseetimeInterval = 0.0; chúc may mắn

+1

công việc tốt 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

Bạn kết thúc tìm nó ra? Tôi thấy rằng bạn nói rằng bạn không thể làm mất hiệu lực bộ đếm thời gian của bạn khi bạn đi vào chế độ xem khác. Bạn có thể giải thích những gì bạn có nghĩa là do đó? NSTimers không thể bị tạm dừng và các phương thức mô phỏng tạm dừng chúng thường liên quan đến việc vô hiệu hóa chúng. Sau đó, bạn có thể mô phỏng "bỏ tạm dừng" bằng cách tạo bộ hẹn giờ mới sau đó sẽ khởi động lại. Điều này sẽ mô phỏng một bộ đếm thời gian bị tạm dừng và bỏ tạm dừng.

Đối với những người muốn có một phương pháp có khả năng thuận tiện hơn, tôi đã viết một lớp điều khiển có thể xử lý thuận tiện việc tạm dừng và bỏ tạm thời bộ hẹn giờ. Bạn có thể tìm thấy nó ở đây: https://github.com/LianaChu/LCPausableTimer

Bạn có thể sử dụng lớp bộ điều khiển mà tôi đã tạo để tạo bộ tính giờ mới, sau đó bạn có thể tạm dừng và bỏ tạm thời bộ hẹn giờ bằng cách gọi phương thức "pauseTimer" và "unpauseTimer" trên lớp bộ điều khiển.

Tôi đánh giá cao mọi nhận xét hoặc phản hồi như cách bạn sử dụng, những thay đổi bạn muốn xem hoặc bất kỳ tính năng nào bạn muốn thêm. Vui lòng trả lời với nhận xét của bạn tại đây hoặc đăng trên tab sự cố trên trang Github.

Các vấn đề liên quan