UIDatePicker作为UITextField的输入视图

问题描述 投票:-1回答:3

在我的代码中,我使用Datepicker作为Textfield的输入视图

self.tFPeriodEndCurrent.inputView = self.datePicker

textfield委托将无法工作,因为Textfield不可编辑。

当用户在Textfield上单击时,我需要将文本字段中的文本(日期)更新为UIPicker输入视图

//assume textfield contains 20/2/2019 , that should reflect in UIdatepicker when user Tap on textfield. 
how to acheive that! any help
ios swift uitextfield uidatepicker
3个回答
2
投票
 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)
        }

    }

0
投票

如果你想带上相同的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)"
   }

}

enter image description here


0
投票

首先,您需要将字符串转换为日期。

假设textfield包含“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;
}

不要忘记设置文本字段委托。

Swift版本

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
}
© www.soinside.com 2019 - 2024. All rights reserved.