DatePicker für zwei unterschiedliche UITextField Objekte

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • DatePicker für zwei unterschiedliche UITextField Objekte

    Ich habe zwei UITextField Objekte und möchte gern beim Anwählen eines Datums aus einem UIDataPicker das Datum in das UITextField.text übernehmen. Das funktioniert auch beim ersten UITextField.text. Sobald ich das zweite UITextField anwähle, dann ändert sich der Textim ersten UITextField.text :evil:

    Dieser Code führt mich zur Verzweifelung :

    Quellcode

    1. import UIKit
    2. class ViewController: UIViewController {
    3. @IBOutlet weak var tournamentStartDate: UITextField!
    4. @IBOutlet weak var tournamentEndDate: UITextField!
    5. override func viewDidLoad() {
    6. super.viewDidLoad()
    7. // Do any additional setup after loading the view.
    8. let disciplinePickerData = pickerData()
    9. let disciplinePickerView = UIPickerView()
    10. disciplinePickerView.dataSource = disciplinePickerData
    11. disciplinePickerView.delegate = disciplinePickerData
    12. disciplinePickerView.reloadAllComponents()
    13. let datePicker = UIDatePicker()
    14. datePicker.datePickerMode = UIDatePicker.Mode.date
    15. datePicker.addTarget(self, action: #selector(ViewController.datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
    16. tournamentStartDate.inputView = datePicker
    17. datePicker.addTarget(self, action: #selector(ViewController.datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
    18. tournamentEndDate.inputView = datePicker
    19. }
    20. @objc func datePickerValueChanged( sender: UIDatePicker) {
    21. let formatter = DateFormatter()
    22. formatter.dateFormat = "dd.MMMM.yyyy"
    23. //formatter.dateStyle = DateFormatter.Style.medium
    24. //formatter.timeStyle = DateFormatter.Style.none
    25. // tournamentStartDate.text = formatter.string(from: sender.date)
    26. tournamentStartDate.text = formatter.string(from: sender.date)
    27. print ("hallo")
    28. }
    29. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    30. view.endEditing(true)
    31. }
    32. }
    Alles anzeigen
    In der Zeile 37 spreche ich das Objekt (tournamentStartDate) an. Hier hätte ich gern einmal das erste Objekt (tournamentStartDate) angesprochen und dann das zweite Objekt (tournamentEndDate).

    mfg André
  • Ein UITextField hat das Property isEditing. Du könntest in Zeile 37 also prüfen, welches der beiden Text Fields gerade editiert wird und bei diesem dann den Text entsprechend setzen.

    In viewDidLoad solltest Du bei dem PickerView nicht zwei mal

    Quellcode

    1. datePicker.addTarget(self, action: #selector(ViewController.datePickerValueChanged(sender:)), for: UIControl.Event.valueChanged)
    verwenden, da datePickerValueChanged dann auch 2 mal aufgerufen wird. ;)
  • Oh ja, cool ....

    Folgende Änderung löst das Problem:

    Quellcode

    1. @objc func datePickerValueChanged( sender: UIDatePicker) {
    2. let formatter = DateFormatter()
    3. formatter.dateFormat = "dd.MMMM.yyyy"
    4. //formatter.dateStyle = DateFormatter.Style.medium
    5. //formatter.timeStyle = DateFormatter.Style.none
    6. // tournamentStartDate.text = formatter.string(from: sender.date)
    7. //tournamentStartDate.text = formatter.string(from: sender.date)
    8. if tournamentStartDate.isEditing {
    9. tournamentStartDate.text = formatter.string(from: sender.date)
    10. } else if tournamentEndDate.isEditing {
    11. tournamentEndDate.text = formatter.string(from: sender.date)
    12. }
    Alles anzeigen
    Aber, kann man nicht "irgendwie" das Objekt nutzen, welches den Aufruf gestartet hat? Hätte ich nun hunderte von Objekte, dann wäre es ja keine galante Lösung.

    Ich danke Dir erst einmal !!!! :thumbsup:
  • Der sender ist ja der UIDatePicker und der ist für alle UITextFields ja gleich. Diese Info bringt Dich also nicht weiter.

    Das UITextField hat eine Delegate Methode textFieldDidBeginEditing(_:), in dieser könntest Du Dir eine Referenz auf das aktivie TextFIeld merken und dann in datePickerValueChanged einfach den Text in dem referenzierten TextField ändern. ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • PMJI :)

    Die von @MCDan genannte Delegate-Methode wird immer dann angesprungen, wenn in einem UITextField editiert wird. Dabei erhält diese Methode das jeweilige UITextField als Parameter übergeben. Du könntest diese Methode nun nutzen, um Dir diese Adresse z. B. in einem Property zu speichern. Wenn Du dann später die Methode des UIDatePickers verwendest, hast Du im Property das passende, zuletzt editierte Textfeld.

    Wichtig ist hierbei, dass die Delegate-Properties der Textfelder auch auf Deinen ViewController gesetzt sind. Ansonsten wird die Delegate-Methode nicht angesprungen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.