我有一个功能:
func runRockRotation(rockSprite: SKSpriteNode){
startRockRotationAnimation(rockSprite, isRock: true)
}
当我这样称呼时:
runRockRotation(rock)
它可以工作,但我似乎无法将它放在NSTimer选择器中。
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)
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotation", userInfo: rock, repeats: false)
此外,尝试没有摇滚,使用零,但似乎没有任何工作。
每次我得到:
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'
如何在带参数的选择器中调用我的函数?我知道如何在Objective C中做到这一点,但似乎无法在Swift中做到这一点。所有帮助将不胜感激。
答案 0 :(得分:8)
查看scheduledTimerWithTimeInterval
你会看到
选择器应具有以下签名:
timerFireMethod:
(包括冒号以指示该方法接受参数)。在 timer将自身作为参数传递,因此该方法将采用 以下模式:
- (void)timerFireMethod:(NSTimer *)timer
您的功能与此模式不匹配,因此无法找到相应的选择器。
使用像 -
这样的东西func runRockRotationForTimer(_ timer: NSTimer){
self.runRockRotation(timer.userInfo as? SKSpriteNode)
timer.invalidate();
}
并使用
安排var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "runRockRotationForTimer:", userInfo: rock, repeats: false)
答案 1 :(得分:2)
还有助于确保目标对象(在您的情况下为self)是NSObject的子类
var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: <THIS MUST BE NSOBJECT SUBCLASS>, selector: "runRockRotation:", userInfo: rock, repeats: false)