2012-07-29 41 views
15

Tôi có một ứng dụng có đồng hồ đếm ngược. Tôi đã thực hiện nó với một nhãn được cập nhật với một chức năng gọi từ một bộ đếm thời gian theo cách này:NSTimer không hoạt động khi đang kéo UITableView

... 
int timeCount = 300; // Time in seconds 
... 
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actualizarTiempo:) userInfo:nil repeats:YES]; 
... 
- (void)actualizaTiempo:(NSTimer *)timer { 
    timeCount -= 1; 
    if (timeCount <= 0) { 
     [timer invalidate]; 
    } else { 
     [labelTime setText:[self formatTime:timeCount]]; 
    } 
} 

Lưu ý: formatTime là một chức năng mà nhận được một số nguyên (số giây) và trả về một NSString với định dạng mm : ss

Mọi thứ hoạt động ok, tức là thời gian đếm ngược nhưng vấn đề là tôi có UITableView trong ứng dụng và nếu tôi chạm vào bảng và kéo nó (để di chuyển dọc theo ô) thì bộ đếm thời gian dừng lại cho đến khi tôi thả ngón tay của tôi ra khỏi màn hình ...

Hành vi này có bình thường không? Nếu có, có cách nào để tránh nó và làm cho bộ đếm thời gian làm việc trong khi kéo bảng?

Trả lời

25

Bằng cách sử dụng scheduledTimerWithTimeInterval:, như j.tom.schroeder cho biết, bộ hẹn giờ của bạn được tự động lên lịch trên vòng lặp chạy chính cho các chế độ mặc định. Điều này sẽ ngăn bộ hẹn giờ của bạn kích hoạt khi vòng lặp chạy của bạn ở chế độ không mặc định, ví dụ: khi nhấn hoặc vuốt.

Các giải pháp, tuy nhiên, không được sử dụng một sợi, nhưng lịch hẹn giờ của bạn cho tất cả các chế độ chung:

NSTimer *timer = [NSTimer timerWithTimeInterval:1 
             target:self 
             selector:@selector(actualizarTiempo:) 
             userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Tùy thuộc vào loại sự kiện mà bạn muốn cho phép mà không có họ dừng giờ, bạn có thể cũng xem xét UITrackingRunLoopMode. Để biết thêm thông tin về các chế độ chạy vòng lặp, hãy xem Apple Docs.

+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn, nó hoạt động với giải pháp này. Tôi sẽ xem xét kỹ hơn về các chế độ vòng lặp để có được sự phù hợp hơn với các sự kiện của tôi – rai212

+1

đừng quên '[timer invalidate];' on 'viewWillDisappear' hoặc bất kỳ phương thức nào khác hoặc bạn sẽ kích hoạt bộ đếm thời gian lặp đi lặp lại . – skornos

0

Đây là hành vi bình thường. scheduledTimerWithTimeInterval: lịch trình trên vòng lặp chạy hiện tại, vì vậy mọi tương tác với UITableView sẽ chặn phương thức actualizarTiempo: không được gọi. Sử dụng các phương pháp NSThread detachNewThreadSelector:toTarget:withObjectsleepForTimeInterval để thực hiện actualizarTiempo: trên một chuỗi riêng biệt.

+0

Thực sự là vấn đề có liên quan đến thực tế là bộ đếm thời gian có liên quan đến vòng lặp chạy hiện hành. Sử dụng NSRunLoop với chế độ vòng lặp khác nhau sẽ khắc phục được sự cố. Cảm ơn bạn – rai212

3

Heres phiên bản Swift:

var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "removeFromSuperview", userInfo: nil, repeats: false) 
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
+0

Phiên bản Swift 3+: RunLoop.main.add (timer, forMode: RunLoopMode.commonModes) –

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