2015-04-10 13 views
5

Mam funkcję:Swift selektor - nierozpoznany selektor wysyłane do instancji

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

Kiedy ja nazywam to tak:

runRockRotation(rock) 

to działa, ale nie wydaje się być w stanie umieść go w selektorze NSTimer.

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

Czytaj wiele forów, próbowałem:

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) 

Również próbowałem bez skale, stosując nil, ale nic nie wydaje się działać.

Za każdym razem otrzymuję:

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' 

Jak mogę zadzwonić do mojej funkcji w selektor z parametrem? Wiem, jak to zrobić w Celu C, ale nie mogę tego zrobić w Swift. Cała pomoc zostanie doceniona.

+0

Gdzie dzwoni zegar? Czy licznik czasu jest tworzony w klasie, w której zdefiniowano runRockRotation? Przekazujesz "ja" jako cel, może to nie jest to czego potrzebujesz? – Chackle

+0

use: 'selector:" runRockRotation: "' – duan

Odpowiedz

8

Sprawdź w dokumentacji scheduledTimerWithTimeInterval

Zobaczysz, że

Selektor powinien mieć następującą sygnaturę: timerFireMethod: (w tym jelita grubego, aby wskazać, że metoda wymaga argumentu).

zegar przechodzi się jako argumentu, więc metoda ta przyjmuje następujący wzór: - (void)timerFireMethod:(NSTimer *)timer

Twoja funkcja nie pasuje do tego wzoru, więc odpowiedni selektor nie można znaleźć.

Zastosowanie coś -

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

i zaplanować go za pomocą

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

FWIW Musiałem również sprawić, by moja funkcja była publiczna – dbro

2

pomaga również upewnić się, że obiekt docelowy (self w danym przypadku) jest podklasą NSObject

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