0
votes

UIDatePicker comme vue d'entrée vers UITextField

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


2 commentaires

voir ceci pour obtenir de l'aide: stackoverflow.com/questions/9116969/...


Vous pouvez ajouter comme méthode addTarget #selector


4 Réponses :


1
votes

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];


3 commentaires

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!



1
votes
 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 commentaires

3
votes

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

}

entrez la description de l'image ici


0 commentaires

1
votes

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.


0 commentaires