繁体   English   中英

UIDatePicker 作为 UITextField 的 Inputview

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

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