从不为NSTimer调用Swift Selector

Tha*_*tta 1 nstimer swift

我在我的雨燕类下面的实例方法Sentence,这使得呼叫给NSTimer它调用的类实例方法,它的选择.当我在没有断点的情况下运行程序时,它会NSTimer成功地进入第一个程序,然后停止NSTimer.当我添加断点以查看是否sentenceDidFinish曾被调用时,我发现它永远不会被证明它在第一次停止时停止NSTimer.

class Sentence : NSObject {
   //init() etc.

   func playEvent(eventIndex : Int){
       if (eventIndex < 2){
           let currEvent = self.eventArray[eventIndex]
           currEvent.startEvent()
           let nextIndex = eventIndex + 1
           print("Play Event event id is ", eventIndex)
           NSTimer.scheduledTimerWithTimeInterval(currEvent.duration, target: self, selector: Selector("playEvent:"), userInfo: NSNumber(integer: nextIndex), repeats: false)
       }
       else if (eventIndex==2){
         self.eventArray[eventIndex].startEvent()
         print("Play Event event id is ", eventIndex)
         NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("sentenceDidFinish"), userInfo: nil, repeats: false)
      }
      else{
        //DO Nothing
      }
  }

  func sentenceDidFinish(){
    //foo
    //bar
  }

}
Run Code Online (Sandbox Code Playgroud)

这是完整的.swift文件:

https://gist.github.com/anonymous/e0839eae1d77e1e4b671

Aar*_*ger 6

playEvent:使用计时器调用时,传递的参数将是计时器本身,而不是整数.但是在声明中eventIndex你表现得好像是整数.

尝试添加这样的方法:

func handleTimer(timer: NSTimer) {
    playEvent(timer.userInfo as! Int)
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用第一个计时器:

NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "handleTimer:", userInfo: NSNumber(integer: nextIndex), repeats: false)
Run Code Online (Sandbox Code Playgroud)

as!如果userInfo不能转换为强制转换()将崩溃Int.更安全,但更详细看起来像:

func handleTimer(timer: NSTimer) {
    guard let index = timer.userInfo as? Int else { return }
    playEvent(index)
}
Run Code Online (Sandbox Code Playgroud)