2015-04-10 22 views
5

Ho una funzione:Selettore Swift - selettore non riconosciuto inviato a un'istanza

func runRockRotation(rockSprite: SKSpriteNode){ 
    startRockRotationAnimation(rockSprite, isRock: true) 
} 

Quando mi chiamano in questo modo:

runRockRotation(rock) 

funziona, ma non riesco a essere in grado di inseriscilo in un selettore NSTimer.

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation:", userInfo: rock, repeats: false) 

letto un sacco di forum, provato questo:

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation()", userInfo: rock, repeats: false) 
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation(_)", userInfo: rock, repeats: false) 
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation", userInfo: rock, repeats: false) 

Inoltre, giudicato senza roccia, utilizzando pari a zero, ma nulla sembra funzionare.

Ogni volta che ottengo:

2015-04-10 15:49:03.830 Meh[1640:218030] -[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840 
2015-04-10 15:49:03.832 Meh[1640:218030] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer runAction:completion:]: unrecognized selector sent to instance 0x174166840' 

Come chiamo la mia funzione in un selettore con un parametro? So come farlo in Objective C, ma non riesco a farlo in Swift. Tutto l'aiuto sarà apprezzato.

+0

Dove stai chiamando il timer? Il timer è stato creato nella classe in cui è stato eseguito runRockRotation? Passi "te stesso" come bersaglio, forse questo non è quello che ti serve? – Chackle

+0

usa: 'selettore:" runRockRotation: "' – duan

risposta

8

Controllare la documentazione per scheduledTimerWithTimeInterval

vedrete che

Il selettore dovrebbe avere la seguente firma: timerFireMethod: (tra cui i due punti per indicare che il metodo prende un argomento).

Il timer si passa come argomento, quindi il metodo potrebbe adottare la seguente schema: - (void)timerFireMethod:(NSTimer *)timer

La funzione non corrisponde questo modello, quindi il selettore appropriato non può essere trovato.

usare qualcosa di simile -

func runRockRotationForTimer(_ timer: NSTimer){ 
    self.runRockRotation(timer.userInfo as? SKSpriteNode) 
    timer.invalidate(); 
} 

e programmare utilizzando

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotationForTimer:", userInfo: rock, repeats: false) 
+0

FWIW Ho anche dovuto rendere pubblica la mia funzione – dbro

2

aiuta anche per assicurarsi che l'oggetto di destinazione (auto nel tuo caso) è una sottoclasse di NSObject

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: <THIS MUST BE NSOBJECT SUBCLASS>, selector: "runRockRotation:", userInfo: rock, repeats: false) 
Problemi correlati