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 文件:
当您使用计时器调用 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)
}
我的 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 文件:
当您使用计时器调用 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)
}