从日期选择器开始的Swift CountDown Days

时间:2018-03-08 00:26:09

标签: ios swift countdown days

我一直在努力在Swift中进行倒计时,它只显示剩下的日子,直到输入为DatePicker的某个日期...我有使用Swift的creo体验,所以,我一直在努力奋斗。我在这里尝试了一些类似的答案,但没有工作,我看了一个教程但是正常倒计时有几个月,几天,几分钟和几秒,这就是代码。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var timeLabel: UILabel!

let formatter = DateFormatter()
let userCleander = Calendar.current;
let requestedComponent : Set<Calendar.Component> = [
    Calendar.Component.month,
    Calendar.Component.day
]

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timePrinter), userInfo: nil, repeats: true)

    timer.fire()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func timeCalculator(dateFormat: String, endTime: String, startTime: Date = Date()) -> DateComponents {
    formatter.dateFormat = dateFormat
    let _startTime = startTime
    let _endTime = formatter.date(from: endTime)

    let timeDifference = userCleander.dateComponents(requestedComponent, from: _startTime, to: _endTime!)
    return timeDifference
}

func timePrinter() -> Void {
    let time = timeCalculator(dateFormat: "MM/dd/yyyy a", endTime: "12/25/2018 a")
    timeLabel.text = "\(time.month!) Months \(time.day!) Days"
}

}

1 个答案:

答案 0 :(得分:1)

有几点:不要使用字符串来比较日期。使用Date对象和日历操作。 (更多关于此的内容。)

不要每秒跑一次计时器。将当前日期保存为用户默认值。启动应用程序后,将保存的日期与当前日期进行比较,看看当天是否已更改。

运行时,请收听UIApplicationSignificantTimeChange通知,当您收到通知时,请检查日期是否已更改。

至于将当前日期与用户选择的日期进行比较,您使用dateComponents(_:from:to:)得到了正确的想法,但您应该传递仅[.day]的组件。

编辑:

像这样的代码可以解决问题:

override func viewDidLoad() {
    super.viewDidLoad()
    //Set up the date picker to pick dates, not dates & times
    datePicker.datePickerMode =  .date

    //Force the date picker to use midnight today as it's base date and
    //to pick a date at least 1 day in the future
    guard let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date()),
        let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)
        else {
            return
    }
    datePicker.minimumDate = tomorrow
    datePicker.date = tomorrow
}

@IBAction func datePickerChanged(_ sender: UIDatePicker) {
    let future = datePicker.date
    //Use midnight today as the starting date
    guard let today = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date()) else { return }

    //Calculate the number of days between today and the user's chosen day.
    let difference = Calendar.current.dateComponents([.day], from: today, to: future)
    guard let days = difference.day else { return }
    let ess = days > 1 ? "s" : ""
    infoLabel.text = "That date is \(days) day\(ess) away."
}