【问题标题】:Calculating Age From Date Picker Swift 3从日期选择器 Swift 3 计算年龄
【发布时间】:2017-01-06 18:47:46
【问题描述】:

在下面的代码中,我实现了一个日期选择器作为我的文本字段的子视图。我被困在这个功能上; '验证年龄'。函数中的 if 语句工作正常,当日期选择器日期高于或低于指定日期时,它将更改 textField 颜色。但它只适用于相应的年份,但不适用于确切的日期。过去两天我一直在尝试搜索,但找不到解决我确切问题的方法。

 class AgeConfirmViewController: UIViewController, UITextFieldDelegate   {

@IBOutlet weak var txtAgeConfirmation: UITextField!
let datePicker: UIDatePicker = UIDatePicker()

 override func viewDidLoad() {
    super.viewDidLoad()
    txtAgeConfirmation.delegate = self
    createDatePicker()
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
    txtAgeConfirmation.inputView = datePicker
    datePicker.addTarget(self, action: #selector(self.datePickerChanged(sender:)), for: .valueChanged)
 }



   func datePickerChanged(sender: UIDatePicker) {
    let formatter = DateFormatter()
    formatter.timeStyle = .none
    formatter.dateStyle = .long
    txtAgeConfirmation.text = formatter.string(from: sender.date)
    verifyAge()
}


  func createDatePicker() {
    datePicker.datePickerMode = .date
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: 0, to: Date())
}


 func verifyAge() {

    let dateOfBirth = datePicker.date
    let today = Date()
    let gregorian = NSCalendar(identifier: NSCalendar.Identifier.gregorian)
    let age = gregorian?.components([.month, .day, .year], from: dateOfBirth, to: today, options:[])

      if (age?.year)! < 21 {


        txtAgeConfirmation.textColor = UIColor.red

    } else if (age?.year)! > 21 {

        txtAgeConfirmation.textColor = UIColor.black

    }
}

【问题讨论】:

  • 请澄清您是否需要将其保留到当天。这意味着如果年龄是 19 岁 11 小时 59 岁,他们不会在 20 岁时吃肉。相反,你得到的是他们今年是否 20 岁但还不是 20 岁。
  • 已澄清。 '它只适用于相应的年份,但不适用于确切的日期'。我希望它是在确切的日子是的。

标签: ios swift swift3 datepicker


【解决方案1】:

简单的解决方案,忽略daymonth

let gregorian = Calendar(identifier: .gregorian)
let ageComponents = gregorian.dateComponents([.year], from: dateOfBirth, to: Date())
let age = ageComponents.year!

txtAgeConfirmation.textColor = age < 21 ? .red : .black

或者如果你想忽略时间

let ageComponents = calendar.dateComponents([.year], from: calendar.startOfDay(for: dateOfBirth), to: calendar.startOfDay(for: Date()))

在 Swift 3 中,通过使用原生 Calendar 结构来减少问号和感叹号。
year 后面的年龄感叹号绝对安全,因为year 组件是明确指定的。

【讨论】:

  • xcode 提示我添加感叹号,而我在提交这个问题之前只有一年的时间。我认为添加月份和日期可以解决它,但它没有。我只是再次更改它,问题仍然是他们..
  • 我不确定你期待什么结果,我用替代方法更新了答案。
  • 添加您更新的代码有帮助,我错过了“startOfDay”中的代码,谢谢
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多