2015-04-20 11 views
39

Nie mogę uruchomić mojego licznika? Nie jak przerwa, ale przystanek.Jak zatrzymać NSTimer.scheduledTimerWithTimeInterval

import UIKit 

class LastManStandingViewController: UIViewController {  

@IBOutlet weak var timeLabel: UILabel! 
@IBOutlet weak var timeTextbox: UITextField! 
@IBOutlet weak var startButton: UIButton! 
@IBOutlet weak var stopButton: UIButton! 

var myCounter = 0 
var myTimer : NSTimer = NSTimer() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    timeLabel.text = String(myCounter) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func startTimer(){ 
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true) 
    println("func startTimer") 
} 

func stopTimer(){ 
    myTimer.invalidate() 
    myCounter = 0 
    timeLabel.text = String(myCounter) 
    println("func stopTimer") 
} 

func updateTimer(){ 
    timeLabel.text = String(myCounter++) 
    println("func updateTimer") 
} 
@IBAction func startButton(sender: AnyObject) { 
    startTimer() 
} 
@IBAction func stopButton(sender: AnyObject) { 
    stopTimer() 
} 

}

mogę uruchomić stoper, ale kiedy nacisnąć przycisk Stop, to zresetować się i zaczyna ponownie liczenie. To się nie kończy.

Sprawdziło się. Coś było nie w porządku z moim projektem! Naprawiono go, usuwając przycisk i dodając je ponownie. Wygląda na to, że miałem duplikat lub coś takiego.

+0

proszę pisać kod (nie możemy przetestować go, jeśli to tylko zrzut ekranu). – Moritz

+1

@ericd Dodano pełny kod teraz. –

+0

Kopiuję-wklejałem ważne bity twojego kodu w przykładowej aplikacji i nie widzę problemów, timer uruchamia się i zatrzymuje poprawnie. Czy na pewno nie robisz nic więcej? [zrzut ekranu z mojego testu] (https://www.evernote.com/shard/s89/sh/ca19d729-0a27-421f-bd79-19cfa7c503c8/25d3926720f64e01c47ae0eaaaa7f3ee/deep/0/AppDelegate.swift.png) – Moritz

Odpowiedz

75

Nie trzeba używać Selector:

@IBAction func startButton(sender: AnyObject) { 
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimer:", userInfo: nil, repeats: true) 
} 

Również zegar przechodzi się do wybranej metody, dzięki czemu można go unieważnić wewnątrz metody, jeśli potrzebujesz:

func updateTimer(timer: NSTimer) { 
    timeLabel.text = String(Counter++) 
    timer.invalidate() 
} 

Lub jeśli licznik czasu jest zmienną instancji:

myTimer.invalidate() 
myTimer = nil 

To dobrze, jeśli chodzi o nil licznik zmiennych instancji po unieważnieniu go, pozwala uniknąć dalszych nieporozumień, jeśli trzeba utworzyć inny timer z tą samą zmienną. Także nazwy metod i zmiennych powinny zaczynać się od małej litery.

Zrzut ekranu pokazujący licznik czasu unieważniony i ustawiony na zero.

screenshot

Aktualizacja Swift 2.2 lub nowszym

Zobacz https://stackoverflow.com/a/36160191/2227743 nowego #selector składni zastępującego Selector().

7

można użyć tego kiedy jakiś warunek jest spełniony i chcesz zatrzymać stoper:

Timer.invalidate() 

Oto prosty przykład:

func UpdateTimer(){ 
    timeLabel.text = String(Counter++) 
    if timeLabel.text == String("5") { 
     Timer.invalidate() 
    } 
} 

ten zatrzyma stoper.

Można go modyfikować zgodnie ze swoimi potrzebami.

-3

Jak wstępnie Swift 2,2

let printTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(printDescription), userInfo: nil, repeats: true) 

func printDescription() { 
    print("Print timer will print every after 2.0 seconds") 
} 

Drukuj czasomierz zostanie wydrukowana każda po 2,0 sekundy

+0

Pytanie brzmiało, jak zatrzymać NSTimer.scheduledTimerWithTimeInterval. – Samball