1

I have a very simple CustomIDatePicker class written in Swift 5, which has a toolbar on top that contains a 'Done' button. The issue is, the keyboard never retracted when this button was pressed. I have tried 4 different methods, please see details below:

import UIKit

class CustomDatePicker: UIDatePicker {

    var zTextField: UITextField!

    let toolbar = UIToolbar()

    convenience init(textField: UITextField) {
        self.init()

        // bar buttons
        let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePressed(sender:)))

        toolbar.sizeToFit()
        toolbar.setItems([doneBtn], animated: true)

        self.datePickerMode = .date

        // link up the Text Field
        zTextField = textField
        zTextField.inputAccessoryView = toolbar
        zTextField.inputView = self
    }

    @objc func donePressed (sender: UIBarButtonItem) {
        print("done pressed") // this line appeared in the debugger

        //self.resignFirstResponder()
        //self.inputView?.resignFirstResponder()
        //self.endEditing(true)
        self.inputView?.endEditing(true) // tried all of these 4, but keyboard always remained in view
    }
}

A very simple ViewController to test this class:

class ViewController: UIViewController {

    @IBOutlet weak var theTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let datePicker = CustomDatePicker(textField: theTextField)
    }
}

Any help would be greatly appreciated!

Jawad Ali
  • 13,556
  • 3
  • 32
  • 49
Steve
  • 95
  • 12

1 Answers1

2

Implement UITextField delegate function

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
  return false
}
@objc func donePressed (sender: UIBarButtonItem) {
        print("done pressed") 

        self.zTextField.resignFirstResponder() // new line
    }
Jawad Ali
  • 13,556
  • 3
  • 32
  • 49