2014-09-14 17 views
10

--EDITED mit aktualisierter INFORMATION--Probleme mit NSTimer (Swift)

Was möchte ich eine Funktion tun zu nennen, ist timerFunc einmal genannt alle fünf Sekunden ein NSTimer.scheduledTimerWithTimeInterval Methode scheint das Problem ist, dass während der Laufzeit, Ich erhalte den Fehler

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-  
[Animation.ViewController timerFunc:]: unrecognized selector sent to instance 0x7fe548d66040' 

im Ausgangsprotokoll. Ich habe die NSTimers anderer Leute vergeblich gesucht, ich sehe einige, die den Selektor wie selector: Selector("timerFunc:") anstelle von selector: Selector("timerFunc") in beide Richtungen haben, aber den Fehler geben. Eine andere Sache ist, dass sowohl die timerFunc Funktion als auch der NSTimer innerhalb von viewDidLoad sind, gibt es irgendwelche Probleme damit? Jeder Einblick in das Problem wird sehr geschätzt, danke fürs Lesen.

timerFunc unten

func timerFunc(){ 

    println("Timer") 
} 

NSTimer unten

NSTimer.scheduledTimerWithTimeInterval(
     5.0, 
     target: self, 
     selector: Selector("timerFunc"), 
     userInfo: nil, 
     repeats: true) 
+1

Was ist die Signatur Ihres TimerFunc? – vacawama

+0

@vacawama Unterschrift? Momentan versuche ich NSTimer zum Laufen zu bringen, also ist meine timerFunc nur eine 'println (" Timer ")' Ich habe meine timerFunc zur Hauptfrage hinzugefügt. Ich habe meine vorherige Frage herausgefunden, es war nur so, dass ich timeInterval nicht anrufen musste :, es hat es aus irgendeinem Grund versaut. Das aktuelle Problem ist, dass es mir keinen Fehler im Editor gibt, aber wenn ich es ausführe, sagt das Ausgabeprotokoll 'App aufgrund der nicht abgefangenen Ausnahme beenden 'NSInvalidArgumentException', Grund: '- [Animation.ViewController timerFunc]: unerkannter Selektor gesendet an Instanz 0x7fcc53e67010' unter mehreren Zeilen Kauderwelsch. – Althonos

+0

Ich habe nur sichergestellt, dass Ihr 'timerFunc' keinen Parameter hat. Deines nicht, also das ist nicht das Problem. Ist Ihre 'timerFunc' eine Methode des' ViewControllers'? – vacawama

Antwort

9

Eine andere Sache ist, dass sowohl die Funktion timerFunc als auch der NSTimer innerhalb von viewDidLoad sind, gibt es irgendwelche Probleme damit?

Ja. Das ist dein Problem. Die timerFunc kann nicht innerhalb von viewDidLoad geschachtelt werden, es muss eine Top-Level-Funktion auf der gleichen Ebene wie viewDidLoad sein.

Wenn der Timer ausgelöst wird, ruft er die durch den Selektor auf dem durch target angegebenen Objekt angegebene Funktion auf. Das heißt, es wird self.timerFunc() aufrufen. Wenn Ihr timerFunc() innerhalb von ViewDidLoad verschachtelt ist, kann es nicht gefunden werden.

+0

Ich habe meine Antwort, ich danke Ihnen allen, die geholfen haben. – Althonos

+0

Warum? Methoden, die dynamisch mit einem Selektor aufgerufen werden, müssen Old-School-Objc-Methoden sein. Alle Methoden einer Klasse, die von NSObject erben, sind standardmäßig, aber wenn Sie NSObject nicht erweitern, können Sie sie mit '@ objc' markieren. –

2

Der erste Parameter einer SWIFT-Verfahren umfassen kein Etikett. Alle anderen tun es im Allgemeinen. Sie sollten die Syntax erwarten:

NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "timerFunc", userInfo: nil, repeats: true) 
+0

Ja, ich habe mich näher mit dem Code anderer Leute befasst und bin zu dieser Schlussfolgerung gekommen, aber jetzt, wenn ich es ausführe, gibt das Ausgabeprotokoll den Fehler 'Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [Animation. ViewController timerFunc]: unerkannter Selektor gesendet an Instanz 0x7fcc53e67010 'Wie werde ich diese Ausnahme abfangen>? – Althonos

+0

Ich habe gerade klargestellt, dass es implementiert wird, indem ich meinen NSTimer auskommentiere und timerFunc mit einer timerFunc() Zeile aufruft. Es scheint, dass es timerFunc nicht als Selektor erkennt, obwohl ich nicht weiß warum. – Althonos

+0

Ich dachte nur, spielt es eine Rolle, wo ich meinen NSTimer habe? Jetzt ist es in SichtDidLoad .. – Althonos

1

Wenn ein Wähler in Swift verwenden Sie den Auswahl() pseudo-Funktion um den Namen der Funktion verwenden müssen:

NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, 
              selector: Selector("timerFunc"), 
              userInfo: nil, 
              repeats: true); 

Der Grund für die scheinbar verwirrenden Fehler, die ich vermute, liegt daran, dass der Compiler nicht in der Lage ist, Ihre Argumentliste einer bestimmten Methode zuzuordnen, da der Selektorname vom falschen Typ ist (String statt Selektor).

Dies erklärt auch die Tatsache, dass, wenn Sie es geschafft haben, es zu kompilieren (wie in den Kommentaren zu einer anderen Antwort erwähnt) es zur Laufzeit fehlgeschlagen. Die Typprüfung zur Kompilierzeit kann diese Art von Fehler nicht erfassen (daher gibt die Laufzeitausnahme den 'nicht erkannten Selektor' an).

+1

Im Allgemeinen müssen Sie dies nicht tun, da es automatisch für Sie behandelt wird. –

+0

Leider habe ich genau den gleichen Laufzeitfehler. Es wird wahrscheinlich automatisch in den Selector-Typ konvertiert, ich habe versucht, es in 'selector: Selector (" timerFunc ") zu ändern," ohne Erfolg ". Mein aktueller Code wird zur Frage hinzugefügt. – Althonos

+0

Ich dachte nur, spielt es eine Rolle, wo ich meinen NSTimer habe? Gerade jetzt ist es in SichtDidLoad .. – Althonos

11

Timer funktionieren nicht mit Rückrufen privater Methoden. Stellen Sie außerdem sicher, Ihre Klasse von NSObject erbt. Pure Swift-Klassen funktionieren nicht.

Weitere Informationen finden Sie hier: https://github.com/NxSoftware/NxSwiftTimer

+3

Yeh, das war mein Problem, Klasse muss von 'NSObject' erben! – Zorayr

+2

+500 für NSObject Sache! – user1244109

+0

Ich habe anscheinend das gleiche Problem mit einer öffentlichen Funktion einer privaten Klasse, wenn ich stattdessen meine private Klasse als intern festlegen, es funktioniert alles gut, jede Idee, warum @Antoine? – Saliom

3

Mein Problem dabei war der Selektor bei einer privaten Funktion hinwies.