Dans mon code, j'ai utilisé Datepicker comme Inputview dans Textfield
//assume textfield contains 20/2/2019 , that should reflect in UIdatepicker when user Tap on textfield. how to acheive that! any help
Les délégués textfield ne fonctionneront pas car Textfield n'est pas modifiable.
J'ai besoin de mettre à jour le texte (date) dans le champ de texte vers la vue d'entrée UIPicker chaque fois que l'utilisateur a cliqué sur le champ de texte
self.tFPeriodEndCurrent.inputView = self.datePicker
4 Réponses :
Vous devez d'abord convertir la chaîne en date.
Supposons que le champ de texte contienne "20/2/2019"
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 }
Vous devez également implémenter la méthode 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; }
N'oubliez pas de définir le délégué textfield.
Version Swift
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"dd/M/yyyy"; NSDate *dt = [formatter dateFromString:self.textField.text];
Cette question est taguée avec Swift donc je suppose qu'OP ne veut pas de solution Obj-C
Ajout de la version rapide. En fait, je n'ai pas vu la balise swift donc .. :-p
merci pour la solution obj-c. d'autres lecteurs (moi dans ce cas) le trouvent utile!
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) } }
Si vous souhaitez apporter le même look & feel UIPickerView, essayez ceci,
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)" } }
Dans Swift 5, Xcode 12 utilise ce qui suit:
if #available(iOS 14, *) { datePicker.preferredDatePickerStyle = .wheels }
Il définira le sélecteur de la même manière que dans iOS 13.
voir ceci pour obtenir de l'aide: stackoverflow.com/questions/9116969/...
Vous pouvez ajouter comme méthode addTarget #selector