2012-07-29 17 views
15

Mam aplikację z licznikiem odliczającym. Zrobiłem go z etykietą, która jest aktualizowana z funkcji o nazwie z zegarem w ten sposób:NSTimer nie działa podczas przeciągania 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]]; 
    } 
} 

Uwaga: formatTime jest funkcją, która otrzyma Integer (liczba sekund) i zwraca NSString z MM : ss

Wszystko działa poprawnie, tzn. czas się odlicza, ale problemem jest to, że mam UITableView w aplikacji i jeśli dotknę tabeli i przeciągnę ją (aby poruszać się wzdłuż komórek), zatrzyma się zegar do zwolnij palec z ekranu ...

Czy to zachowanie jest normalne? Jeśli tak, czy jest jakiś sposób, aby tego uniknąć i sprawić, by timer działał podczas przeciągania stołu?

Odpowiedz

25

Używając scheduledTimerWithTimeInterval:, jak j.tom.schroeder mówi, twój timer jest automatycznie planowany w pętli głównego uruchomienia dla trybów domyślnych. Zapobiegnie to wystrzeleniu timera, gdy pętla uruchamiania znajduje się w trybie innym niż domyślny, np. Podczas stukania lub przesuwania.

rozwiązanie, choć nie używa nici, ale planując swój czasomierz dla wszystkich popularnych trybach:

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

w zależności od rodzaju zdarzeń chcesz pozwolić bez nich zatrzymując swoje czasomierze, to polubisz również rozważyć UITrackingRunLoopMode. Aby uzyskać więcej informacji o trybach uruchamiania pętli, zobacz Apple Docs.

+0

Bardzo dziękuję za pomoc, działa z tym rozwiązaniem. Przyjrzę się bliżej trybom pętli, aby uzyskać ten, który lepiej pasuje do moich wydarzeń. – rai212

+1

nie zapomnij o "[unieważnianiu zegara];' w 'viewWillDisappear' lub jakiejkolwiek innej metodzie lub będziesz strzelał czasomierz raz po raz . – skornos

0

Jest to normalne zachowanie. scheduledTimerWithTimeInterval: harmonogramy w bieżącej pętli uruchamiania, więc wszelkie interakcje z UITableView zablokują wywołanie metody actualizarTiempo:. Użyj metod NSThread detachNewThreadSelector:toTarget:withObject i sleepForTimeInterval do wykonania actualizarTiempo: w osobnym wątku.

+0

Naprawdę problem wiązał się z faktem, że licznik był związany z pętli prądowej wykonywania. Użycie NSRunLoop w innym trybie pętli rozwiązuje problem. Dziękuję – rai212

3

Herezje Swift wersja:

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

Wersja Swift 3+: RunLoop.main.add (timer, forMode: RunLoopMode.commonModes) –

Powiązane problemy