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