![](/img/trans.png)
[英]iOS 7 : UITextField inputView issue when set to UIDatePicker
[英]UIDatePicker as a Inputview to UITextField
在我的代码中,我使用 Datepicker 作为 Textfield 的 Inputview
self.tFPeriodEndCurrent.inputView = self.datePicker
文本字段委托将不起作用,因为文本字段不可编辑。
当用户单击文本字段时,我需要将文本字段中的文本(日期)更新为 UIPicker 输入视图
//assume textfield contains 20/2/2019 , that should reflect in UIdatepicker when user Tap on textfield.
how to acheive that! any help
首先以编程方式创建 datePicker:
private lazy var datePicker: UIDatePicker = {
let datePicker = UIDatePicker(frame: .zero)
datePicker.datePickerMode = .date
datePicker.timeZone = TimeZone.current
return datePicker
}()
在“viewDidLoad”或“awakeFromNib”中:
fieldValueTextField.inputView = datePicker
datePicker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
创建将处理编辑的方法:
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
fieldValueTextField.text = dateFormatter.string(from: sender.date)
}
在 Swift 5 中,Xcode 12 使用以下内容:
if #available(iOS 14, *) {
datePicker.preferredDatePickerStyle = .wheels
}
它将选择器设置为与 iOS 13 中的相同。
如果你想带来相同的 UIPickerView 外观,试试这个,
class ViewController: UIViewController {
@IBOutlet weak var dateField: UITextField!
var datePicker :UIDatePicker!
override func viewDidLoad() {
super.viewDidLoad()
datePicker = UIDatePicker.init(frame: CGRect(x: 0, y: 0, width: view.bounds.size.width, height: 200))
datePicker.addTarget(self, action: #selector(self.dateChanged), for: .allEvents)
dateField.inputView = datePicker
let doneButton = UIBarButtonItem.init(title: "Done", style: .done, target: self, action: #selector(self.datePickerDone))
let toolBar = UIToolbar.init(frame: CGRect(x: 0, y: 0, width: view.bounds.size.width, height: 44))
toolBar.setItems([UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil), doneButton], animated: true)
dateField.inputAccessoryView = toolBar
}
@objc func datePickerDone() {
dateField.resignFirstResponder()
}
@objc func dateChanged() {
dateField.text = "\(datePicker.date)"
}
}
class ViewController: UIViewController {
@IBOutlet weak var txtDatePicker: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let datePickerView = UIDatePicker()
datePickerView.datePickerMode = .date
txtDatePicker.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
}
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy"
txtDatePicker.text = dateFormatter.string(from: sender.date)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
}
首先,您需要将字符串转换为日期。
假设文本字段包含“20/2/2019”
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"dd/M/yyyy";
NSDate *dt = [formatter dateFromString:self.textField.text];
您还需要实现UITextFieldDelegate
方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
if (self.tFPeriodEndCurrent == textField) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"dd/M/yyyy";
NSDate *dt = [formatter dateFromString:textField.text];
if (textField.inputView isKindOfClass:[UIDatePicker class]) {
UIDatePicker *dtPicker = (UIDatePicker *)textField.inputView;
[dtPicker setDate:dt];
}
}
return TRUE;
}
不要忘记设置文本字段委托。
斯威夫特版本
var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
return formatter
}()
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
guard let txtDate = textField.text else { return true }
if textField == tFPeriodEndCurrent, let dt = dateFormatter.date(from: txtDate) {
if let datePicker = textField.inputView as? UIDatePicker {
datePicker.setDate(dt, animated: true)
}
}
return true
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.