【问题标题】:Perform Auto Segue when Timer is finished?Timer 结束时执行 Auto Segue?
【发布时间】:2020-06-15 22:22:25
【问题描述】:

当我的计时器达到零并且当前出现问题时,我正在尝试执行 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))
        })


    }

}

【问题讨论】:

  • 如果你很好地格式化你的代码,它可以帮助人们阅读你的问题。在 Xcode 中使用 cmd-A ctrl-i 正确缩进代码。然后,您可以在粘贴到您的问题之前删除不必要的空行。
  • 谢谢保罗,我一定会接受的。

标签: ios swift xcode segue


【解决方案1】:

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

【讨论】:

  • 谢谢保罗!这正是我想要的。谢谢你的建议,我真的很感激。保持健康。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多