从不为NSTimer调用Swift选择器

从不为NSTimer调用Swift选择器,swift,nstimer,Swift,Nstimer,在我的Swift类语句中有以下实例方法,它调用一个NSTimer,它调用类实例方法作为它的选择器。当我在没有断点的情况下运行程序时,它成功地到达第一个NSTimer,但随后在NSTimer处暂停。当我添加一个断点以查看是否调用过sentencedidfish时,我发现它从未调用过,证明它在第一次调用时停止 class Sentence : NSObject { //init() etc. func playEvent(eventIndex : Int){ if (ev

在我的Swift类
语句中有以下实例方法
,它调用一个
NSTimer
,它调用类实例方法作为它的选择器。当我在没有断点的情况下运行程序时,它成功地到达第一个
NSTimer
,但随后在
NSTimer
处暂停。当我添加一个断点以查看是否调用过
sentencedidfish
时,我发现它从未调用过,证明它在第一次调用时停止

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
  }

}
类语句:NSObject{
//init()等。
func播放事件(事件索引:Int){
if(eventIndex<2){
让currEvent=self.eventArray[eventIndex]
current.startEvent()
设nextIndex=eventIndex+1
打印(“播放事件id为”,事件索引)
NSTimer.scheduledTimerWithTimeInterval(current.duration,target:self,selector:selector(“playEvent:”),userInfo:NSNumber(integer:nextIndex),repeats:false)
}
else if(eventIndex==2){
self.eventArray[eventIndex].starteEvent()
打印(“播放事件id为”,事件索引)
scheduledTimerWithTimeInterval(0.4,目标:self,选择器:selector(“sentenceDidFinish”),userInfo:nil,repeats:false)
}
否则{
//无所事事
}
}
func语句didfish(){
//福
//酒吧
}
}
以下是完整的.swift文件:


使用计时器调用
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)
然后像这样调用第一个计时器:

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)
}

使用计时器调用
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)
然后像这样调用第一个计时器:

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)
}

您是在具有runloop的线程上调用此函数吗?您是在具有runloop的线程上调用此函数吗?在调用不带参数的
选择器
的情况下,如果userInfo设置为
nil
,选择器是否仍将
(timer:NSTimer)
作为其参数?如果在末尾删除冒号,没有通过任何辩论。
userInfo
的状态是不相关的。在调用不带参数的
选择器
的情况下,如果userInfo设置为
nil
,选择器是否仍将
(timer:NSTimer)
作为其参数?如果在末尾删除冒号,则不会传递任何参数。
userInfo
的状态不相关。