2016-11-19 4 views
1

Ich bin mir nicht sicher, warum, aber jedes Mal, wenn ich meine Anwendung ausführen, wird mein Timer die Update-Funktion nicht aufrufen. Ich habe alles versucht: #selector verwenden, einen Doppelpunkt am Ende des Updates hinzufügen, nichts funktioniert. Ich habe in meinem Update eine print-Anweisung hinzugefügt, um sicherzustellen, dass sie dort ankommt, und die print-Anweisung druckt nie! Ich bin mir nicht sicher, warum es nicht gerufen wird .... Hilfe! P.S. Ich weiß, dass ausgewählt ist in der Tat eine der Optionen in der if-Anweisung, ich hatte eine Druckanweisung dafür und es funktioniert.Timer ruft nicht Selektor-Funktion

if (selected == "05 seconds") { 
     count = 5 
     timer = Timer(timeInterval: 1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 

    } 
    else if (selected == "10 seconds") { 
     count = 10 
     timer = Timer(timeInterval: 1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
    } 
    else if (selected == "20 seconds") { 
     count = 20 
     timer = Timer(timeInterval: 1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
    } 
    else if (selected == "30 seconds") { 
     print("I'm here!") 
     count = 30 
     timer = Timer(timeInterval: 1.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
    } 
    else if (selected == "Single Shot") { 
     SendButton.isHidden = false 
     countDownLabel.isHidden = true 
    } 
} 
    func update() { 
    print("Now I'm in update!") 
    count = count - 1; 
    countDownLabel.text = String(count) 
} 
+1

Die richtige Methode zur Verwendung von Selektoren in Swift 3 ist auch '#selector (update (_ :))'. Auf diese Weise können Sie den Absender an die Funktion übergeben. – TheValyreanGroup

Antwort

5

Der Timer funktioniert nicht, weil die Methode erfordert, dass Sie verwenden, dass der Timer explizit auf die Runloop hinzugefügt wird.

Verwenden Sie die API, die den Timer implizit zum Runloop hinzufügt.

timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(update), userInfo: nil, repeats: true) 

PS: Die #selector Syntax bevorzugt, da sie die Existenz des Aktionsmethode zum Zeitpunkt der Kompilierung überprüft.

+0

Vielen Dank !!! Das hat mein Problem behoben :) –

+0

Ich habe das genau gemacht, aber es ruft immer noch nicht meine Update-Funktion ... Wissen warum? – RufusV

+0

Es könnte viele Gründe geben. Passt die Funktion zum Selektor? Gibt es einen starken Bezug zum "Timer"? Ist das 'Ziel' in der gleichen Klasse wie der' Selektor'? – vadian