Swift选择器 - 发送到实例的无法识别的选择器

时间:2015-04-10 12:56:21

标签: ios swift selector nstimer

我有一个功能:

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中做到这一点。所有帮助将不胜感激。

2 个答案:

答案 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)