Search code examples
swiftdatepickertextfield

How to disable DatePicker interaction(for selecting date) for one textfield in swift"


I am using datePicker for fromDateTf and toDateTf textfields.. now i need to make toDateTf's date picker interaction disable(means date shouldn't select) if fromDateTf textfield text is empty.. how?

for datepicker

let screenWidth = UIScreen.main.bounds.width

let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))


class PostServiceRequestVC: UIViewController, UITextViewDelegate {


@IBOutlet weak var toDateTf: UITextField!
@IBOutlet weak var fromDateTf: UITextField!


 override func viewDidLoad() {
    super.viewDidLoad()

    fromDateTf.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), tag: 0)
    toDateTf.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), tag: 1)
            
    
}


@objc func doneButtonPressed(_ sender: UIBarButtonItem) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let arr = [fromDateTf,toDateTf]
    
    let current = arr[sender.tag]
    if let datePicker = current?.inputView as? UIDatePicker {
        current?.text = dateFormatter.string(from: datePicker.date)
        
        current?.resignFirstResponder()
    }
            
}



extension UITextField {

func addInputViewDatePicker(target: Any, selector: Selector, tag: Int) {
    

    datePicker.datePickerMode = .date
    self.inputView = datePicker
    
    if #available(iOS 13.4, *) {
        datePicker.preferredDatePickerStyle = .wheels
        datePicker.sizeToFit()
    }
    let todaysDate = Date()

    datePicker.minimumDate = todaysDate
    
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    doneBarButton.tag = tag
    
    self.inputAccessoryView = toolBar
}

@objc func cancelPressed() {
    self.resignFirstResponder()
}
}

with the above code i am able to select dates for two textfields.. but

here fromDateTf.text is empty so want to disable interaction for toDateTf's datepicker

enter image description here

i want user should select fromdate first.. without fromdate i do not want to give access to select todate how?... please help me

EDIT: according to below answer if i add that code in viewDidLoad then all the time toDateTf stopping me to show datepicker and select date

so i have added that code in doneButtonPressed so here for the first time i am bale to show datepicker and select date.. but from the 2nd time if the fromDateTf is empty then working.. but its not working for the 1st time.. for first time also if fromDateTf is empty then toDateTf.isEnabled = false should work.. how to achieve please do help.

   @objc func doneButtonPressed(_ sender: UIBarButtonItem) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let arr = [fromDateTf,toDateTf]

    let current = arr[sender.tag]
    if let datePicker = current?.inputView as? UIDatePicker {

        if fromDateTf.text?.isEmpty ?? true {

               toDateTf.isEnabled = false
            
            } else {
               toDateTf.isEnabled = true
        }
        current?.text = dateFormatter.string(from: datePicker.date)

        current?.resignFirstResponder()
    }

}

Solution

  • You could make a function that checks whether or not the fromDateTf is empty, and adjust the UI accordingly:

    func checkForText() {
    
         if fromDateTF.text == "" { //you can also use .isEmpty if you'd rather
    
            toDateTf.isEnabled = false 
    
         } else {
    
            toDateTf.isEnabled = true
    
         }
    

    Then, you can call this function in your ViewDidLoad and any subsequent time you change anything with your textboxes. It'll be a good idea to add in the else part of it so that when you fill in your fromDateTf, it reEnables the other one.