[英]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.