我正在尝试使用NSTimer
在录制语音时增加应用中的进度条(请参阅屏幕截图)
let timedClock = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("Counting:"), userInfo: nil, repeats: true)
internal func Counting(timer: NSTimer!) {
if timeCount == 0 {
//self.timedClock = nil
stopRecording(self) //performs segue to another view controller
} else {
timeCount--;
self.timer.text = "\(timeCount)"
}
print("counting called!")
progressBar.progress += 0.2
}
在编译和运行项目后,进度条仅适用于第一次。录制完成后,应用程序会执行segue到另一个视图控制器播放录制的音频。但是,当我返回视图进行录制时,计时器/进度条会自动运行。我怀疑NSTimer
对象在NSRunLoop上仍然存在。所以我想知道如何阻止NSTimer
自动运行。
受到SO thread中答案的启发,我尝试了以下操作,但NSTimer仍会自动运行。
let timedClock = NSTimer(timeInterval: 1, target: self, selector: "Counting:", userInfo: nil, repeats: true)
NSRunLoop.currentRunLoop().addTimer(timedClock, forMode: NSRunLoopCommonModes)
答案 0 :(得分:2)
这是因为当您的控制器创建它时,它的属性会自动初始化。根据{{3}}(和方法的名称)scheduledTimerWithTimeInterval
创建并返回预定计时器。因此,如果您只想创建计时器并通过触发器函数调用它,请使用如下:
class MyClass {
var timer: NSTimer?
...
func enableTimer() {
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("Counting:"), userInfo: nil, repeats: true)
}
func disableTimer() {
timer?.invalidate()
timer = nil
}
...
}
答案 1 :(得分:1)
很抱歉快速自我回答,因为我发现我可以使用invalidate()
方法来防止计时器自动触发:
timedClock.invalidate()
希望将来帮助某人!