ios - Timer 结束时执行 Auto Segue?
问题描述
当我的计时器达到零并且当前遇到问题时,我正在尝试执行 segue。我已经删除了所有代码,因为我一直在尝试在执行 segue 之前提供更清晰的视图。下面我将发布倒计时的代码。任何帮助让它在完成后继续运行将不胜感激。先感谢您
class CountdownViewController: UIViewController {
@IBOutlet weak var iconImage: UIImageView!
@IBOutlet weak var countdownLabel: UILabel!
//Countdown
let futureDate: Date = {
let future = DateComponents(
year: 2020,
month: 6,
day: 16,
hour: 09,
minute: 32 ,
second: 45
)
return Calendar.current.date(from: future)!
}()
var countdown: DateComponents {
return Calendar.current.dateComponents([.day, .hour, .minute, .second], from: Date(), to: futureDate)
}
@objc func updateTime() {
let countdown = self.countdown //only compute once per call
let days = countdown.day!
let hours = countdown.hour!
let minutes = countdown.minute!
let seconds = countdown.second!
self.countdownLabel.text = String(format: "%02d %02d %02d %02d", days, hours, minutes, seconds)
}
override func viewDidLoad() {
super.viewDidLoad()
func runCountdown() {
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: false)
}
runCountdown()
(print(countdown))
(print(countdownLabel as Any))
UIView.animate(withDuration: 3.0 , animations: {
self.countdownLabel.alpha = 0
self.countdownLabel.alpha = 50
self.countdownLabel.alpha = 100
})
UIView.animate(withDuration: 5.0, delay: 0 , options: [.repeat , .autoreverse , .curveEaseIn] , animations: {
let angle = CGFloat(Double.pi)
self.iconImage.transform = CGAffineTransform.init(rotationAngle: (angle))
})
}
}
解决方案
基本上,您需要做的就是将您futureDate
的日期与当前日期进行比较,如果futureDate
是过去,则执行 segue。
我冒昧地删除了一些代码以使我的答案更清晰(viewDidLoad
例如,其中的动画不会实现任何效果)。我还将该runCountdown
功能移出viewDidLoad
(我怀疑这只是支架平衡错误?)。
class CountdownViewController: UIViewController {
@IBOutlet weak var iconImage: UIImageView!
@IBOutlet weak var countdownLabel: UILabel!
var timer: Timer?
//Countdown
let futureDate: Date = {
let future = DateComponents(
year: 2020,
month: 6,
day: 16,
hour: 09,
minute: 32,
second: 45
)
return Calendar.current.date(from: future)!
}()
override func viewDidLoad() {
super.viewDidLoad()
self.runCountdown()
}
func runCountdown() {
self.timer = Timer.scheduledTimer(timeInterval: 0.5, repeats: true) { [weak self] timer in
guard let self = self else {
return
}
let now = Date()
guard self.futureDate > now else {
self.performSegue(withIdentifier:"nextScreen",sender: self)
self.timer.invalidate()
self.timer = nil
return
}
let countdown = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: now, to: self.futureDate)
guard let days = countdown.day, let hours = countdown.hour, minutes = countdown.minute, seconds = countdown.second else {
return
}
self.countdownLabel.text = String(format: "%02d %02d %02d %02d", days, hours, minutes, seconds)
}
}
}