Swift 永远不会为 NSTimer 调用选择器

Swift Selector is never called for NSTimer

我的 Swift class Sentence 中有以下实例方法,它调用 NSTimer 调用 class 实例方法作为它的选择器。当我 运行 程序没有断点时,它成功到达第一个 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
  }

}

这是完整的 .swift 文件:

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

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

尝试添加这样的方法:

func handleTimer(timer: NSTimer) {
    playEvent(timer.userInfo as! Int)
}

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

NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "handleTimer:", userInfo: NSNumber(integer: nextIndex), repeats: false)

如果 userInfo 无法转换为 Int,则强制转换 (as!) 将崩溃。更安全,但更冗长的是:

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