简体   繁体   English

文本字段和日期选择器更改值

[英]Textfield and datepicker change values

I try to use this code to get date picker when clicking on a text field:单击文本字段时,我尝试使用此代码获取日期选择器:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var DOBTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed))
}

@objc func doneButtonPressed() {
    if let  datePicker = self.DOBTextField.inputView as? UIDatePicker {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
    }
    self.DOBTextField.resignFirstResponder()
 }
}


 extension UITextField {

   func addInputViewDatePicker(target: Any, selector: Selector) {

    let screenWidth = UIScreen.main.bounds.width

    //Add DatePicker as inputView
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .time
    datePicker.locale = Locale.init(identifier: "it_IT")
    self.inputView = datePicker

    //Add Tool Bar as input AccessoryView
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    self.inputAccessoryView = toolBar
 }

   @objc func cancelPressed() {
     self.resignFirstResponder()
   }
}

But when I click on text field again, time on date picker move forward on 3 dimensions.但是当我再次单击文本字段时,日期选择器上的时间在 3 个维度上向前移动。 How this can be fixed?如何解决这个问题? I want time on date picker to rest the same as it is on text field.我希望日期选择器上的时间与文本字段上的时间相同。

在此处输入图片说明

I try to implement this code, but it crash:我尝试实现此代码,但它崩溃了:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var DOBTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), textFieldText: DOBTextField.text ?? "")
}

@objc func doneButtonPressed() {
    if let  datePicker = self.DOBTextField.inputView as? UIDatePicker {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
    }
    self.DOBTextField.resignFirstResponder()
 }
}


 extension UITextField {

   func addInputViewDatePicker(target: Any, selector: Selector , textFieldText: String?) {


    let screenWidth = UIScreen.main.bounds.width

    //Add DatePicker as inputView
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .time
    datePicker.locale = Locale.init(identifier: "it_IT")
    self.inputView = datePicker

    if textFieldText != nil {
        /// Set Textfield date & time
          let dateFormatter = DateFormatter()
          dateFormatter.dateStyle = .none
          dateFormatter.timeStyle = .short
          dateFormatter.locale = Locale.init(identifier: "it_IT")
          datePicker.date = dateFormatter.date(from: textFieldText!)!
      }
     else {
      /// set current date & time
      datePicker.date = Date()
    }


    //Add Tool Bar as input AccessoryView
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    self.inputAccessoryView = toolBar
 }

   @objc func cancelPressed() {
     self.resignFirstResponder()
   }
}

How this can be fixed?如何解决这个问题?

As per I understand, You want to textfield's time when datepicker opens.据我了解,当日期选择器打开时,您想要文本字段的时间。 You just have to set date for DatePicker when it will be initialized.您只需要在 DatePicker 初始化时为其设置日期。

Set DatePicker's date :设置 DatePicker 的日期:

extension UITextField {

func addInputViewDatePicker(target: Any, selector: Selector , textFieldText:String?) {


//Add DatePicker as inputView

//Set date for date Picker
  if textFieldText != nil {
      /// Set Textfield date & time
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        datePicker.date = dateFormatter.date(from: textFieldText!)!
    }
   else {
    /// set current date & time
    datePicker.date = Date()
  }

     //Add Tool Bar as input AccessoryView
  }
}

Change in your viewDidLoad:更改您的 viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), textFieldText: DOBTextField.text ?? "")
}

I hope you understand what you have to set with datepicker.我希望你明白你必须用 datepicker 设置什么。 If this code is not working as you want then take Action of textfield (Editing Did Begin) & try to set textfield inputView in Action.如果此代码无法正常工作,则采取文本字段的操作(编辑已开始)并尝试在操作中设置文本字段 inputView。

It seems this problem only appears on simulators.看来这个问题只出现在模拟器上。 When I try to test this code on real device everything works fine.当我尝试在真实设备上测试此代码时,一切正常。 May be it's just Xcode bug.可能只是 Xcode 的错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM