2015-04-20 5 views
39

Wie ich vom Laufen meine Timer zu stoppen? Nicht wie eine Pause, sondern ein Halt.Wie zu stoppen 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() 
} 

}

ich den Timer starten, aber wenn ich die Stopp-Taste drücken, es selbst zurücksetzen, und beginnt wieder zu zählen. Es hört nicht auf.

Hat es funktioniert. Etwas war fehlerhaft mit meinem Projekt! Es wurde behoben, indem die Schaltfläche entfernt und erneut hinzugefügt wurde. Sieht so aus, als hätte ich ein Duplikat oder so etwas.

+0

Bitte senden Sie drucken Ihren Code (wir können es nicht testen, ob es nur ein Screenshot). – Moritz

+1

@ericd Vollständiger Code jetzt hinzugefügt. –

+0

Ich habe die wichtigen Bits Ihres Codes in eine Beispiel-App kopiert und sehe keine Probleme, der Timer startet und stoppt ordnungsgemäß. Bist du sicher, dass du nichts anderes tust? [Screenshot meines Tests] (https://www.evernote.com/shard/s89/sh/ca19d729-0a27-421f-bd79-19cfa7c503c8/25d3926720f64e01c47ae0eaaaa7f3ee/deep/0/AppDelegate.swift.png) – Moritz

Antwort

75

Sie müssen Selector nicht verwenden:

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

Auch der Timer geht selbst auf die gewählte Methode, so dass Sie es in der Methode ungültig machen können, wenn Sie benötigen:

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

oder wenn der Timer eine Instanzvariable ist:

myTimer.invalidate() 
myTimer = nil 

Es ist eine gute Sache zu nil der Variablentimer der Instanz, nachdem er ungültig gemacht wurde, vermeidet es weitere Verwirrung, wenn Sie einen weiteren Timer mit derselben Variablen erstellen müssen. Methodennamen und Variablen sollten auch mit einem Kleinbuchstaben beginnen.

Screenshot, um den Timer für ungültig zu erklären und auf Null zu setzen.

screenshot

Update für Swift 2.2+

Siehe https://stackoverflow.com/a/36160191/2227743 für die neue #selector Syntax ersetzt Selector().

7

können Sie diese verwenden, wenn eine bestimmte Bedingung erfüllt ist, und Sie möchten Timer stoppen:

Timer.invalidate() 

Hier ist einfaches Beispiel:

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

dieser Timer stoppen.

Sie können es nach Ihren Bedürfnissen ändern.

-3

Wie bereits 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") 
} 

Print Timer wird jedes Mal nach 2,0 Sekunden

+0

Die Frage war, wie man einen NSTimer.scheduledTimerWithTimeInterval stoppt. – Samball