首页 > 解决方案 > 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))
        })


    }

}

标签: iosswiftxcodesegue

解决方案


基本上,您需要做的就是将您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)
        }
    }
}

推荐阅读