我正在尝试使用进度条使此功能正常工作:
var progressTimer: Timer?
var time: CGFloat = 0
func setProgress(duration: CGFloat) {
time += 0.1
progressFront.progress = time / duration
if time >= duration {
progressTimer?.invalidate()
}
}
func updateProgress() {
progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(ViewController.setProgress)), userInfo: nil, repeats: true)
}
func pauseUpdateProgress() {
progressTimer?.invalidate()
}
调用这样的函数,它只是起作用:
setProgress(duration: 20)
如果我像下面那样对它进行硬编码,那么它的工作正常:
func setProgress() {
time += 0.1
progressFront.progress = time / 20
if time >= 20 {
progressTimer?.invalidate()
}
}
我做错了什么?
答案 0 :(得分:1)
首先,当你有Timer
处理程序的参数时,它必须是Timer
本身:
func setProgress(_ timer: Timer) {
...
}
其次,#selector
应指明方法的参数,例如: #selector(setProgress(_:))
。
答案 1 :(得分:0)
selector
的{{1}}可以有一个参数,但该参数的类型必须为Timer
。你不能以这种方式通过持续时间。
然而,这正是为什么有一个Timer
参数,你可以通过:
userInfo
即使这对你来说也不是最好的解决方案,因为在暂停之后,你将不得不再次通过这段时间。
最简单的解决方案是将持续时间保存到属性中。
... userInfo: ["duration": 20.0], repeats: true)