简体   繁体   中英

UIDatePicker as a Inputview to UITextField

In my code i have used Datepicker as a Inputview to Textfield

self.tFPeriodEndCurrent.inputView = self.datePicker

textfield delegates won't work because Textfield is not editable.

i need to update text(date) in textfield to UIPicker input view when ever user clicked on Textfield

//assume textfield contains 20/2/2019 , that should reflect in UIdatepicker when user Tap on textfield. 
how to acheive that! any help

Firstly create datePicker programmatically:

private lazy var datePicker: UIDatePicker = {
  let datePicker = UIDatePicker(frame: .zero)
  datePicker.datePickerMode = .date
  datePicker.timeZone = TimeZone.current
  return datePicker
}()

In 'viewDidLoad' or 'awakeFromNib':

  fieldValueTextField.inputView = datePicker
  datePicker.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)

Create the method that will handle editing:

@objc func handleDatePicker(sender: UIDatePicker) {
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "dd MMM yyyy"
      fieldValueTextField.text = dateFormatter.string(from: sender.date)
 }

In Swift 5, Xcode 12 use the following:

if #available(iOS 14, *) {
    datePicker.preferredDatePickerStyle = .wheels
}

It will set the picker to the same like in iOS 13.

If you want to bring the same UIPickerView look & feel try this,

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)
        }

    }

First you need to convert the string into date.

Assume textfield contains "20/2/2019"

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"dd/M/yyyy";
NSDate *dt = [formatter dateFromString:self.textField.text];

You also need to implement UITextFieldDelegate method

- (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;
}

Don't forget to set the textfield delegate.

Swift version

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
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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