Innocent
Innocent

Reputation: 733

Programmatically Created UITextField not loading text IOS swift

Hello developers i know this is very simple question but i am new in swift i am trying to set date from date picker dialog but when I click done button it does not load date text, I created textfield programmatically.

  import UIKit

 class ViewController: UIViewController {
   
var textField: UITextField  {
        let txt =  UITextField(frame: CGRect(x:0 , y:0, width:200, height: 60))
        txt.textColor = .black
        txt.placeholder = "Select Date"
        txt.textAlignment = .left
        txt.center = self.view.center
        txt.translatesAutoresizingMaskIntoConstraints = false
      
        txt.datePicker(target: self,doneAction: #selector(doneAction),cancelAction: #selector(cancelAction),datePickerMode: .date)
       
        return txt
    }

override func viewDidLoad() {
    super.viewDidLoad()
    
    view.addSubview(self.textField)
    self.textField.text = "test"
}

@objc
func cancelAction() {
    self.textField.resignFirstResponder()
}

@objc
func doneAction() {
    if let datePickerView = self.textField.inputView as? UIDatePicker {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"
        let dateString = dateFormatter.string(from: datePickerView.date)
        self.textField.text = dateString
        print(dateString)
        self.textField.resignFirstResponder()
    }
 }
}

 extension UITextField {
  func datePicker<T>(target: T,
                   doneAction: Selector,
                   cancelAction: Selector,
                   datePickerMode: UIDatePicker.Mode = .date) {
    let screenWidth = UIScreen.main.bounds.width
    
    func buttonItem(withSystemItemStyle style: UIBarButtonItem.SystemItem) -> UIBarButtonItem {
        let buttonTarget = style == .flexibleSpace ? nil : target
        let action: Selector? = {
            switch style {
            case .cancel:
                return cancelAction
            case .done:
                return doneAction
            default:
                return nil
            }
        }()
        
        let barButtonItem = UIBarButtonItem(barButtonSystemItem: style,
                                            target: buttonTarget,
                                            action: action)
        
        return barButtonItem
    }
    
    let datePicker = UIDatePicker(frame: CGRect(x: 0,
                                                y: 0,
                                                width: screenWidth,
                                                height: 216))
    datePicker.datePickerMode = datePickerMode
    self.inputView = datePicker
    
    let toolBar = UIToolbar(frame: CGRect(x: 0,
                                          y: 0,
                                          width: screenWidth,
                                          height: 44))
    toolBar.setItems([buttonItem(withSystemItemStyle: .cancel),
                      buttonItem(withSystemItemStyle: .flexibleSpace),
                      buttonItem(withSystemItemStyle: .done)],
                     animated: true)
    self.inputAccessoryView = toolBar
  }
 }

everything looks good but text not loading when i set inputText.text = "date" on done button click, while date is showing in console.

Upvotes: 0

Views: 367

Answers (1)

Faysal Ahmed
Faysal Ahmed

Reputation: 7669

Try this:

var textField: UITextField = {
        let txt =  UITextField(frame: CGRect(x:0 , y:0, width:200, height: 60))
        txt.textColor = .black
        txt.placeholder = "Select Date"
        txt.textAlignment = .left
        txt.translatesAutoresizingMaskIntoConstraints = false
      
        txt.datePicker(target: self,doneAction: #selector(doneAction),cancelAction: #selector(cancelAction),datePickerMode: .date)
       
        return txt
    }()

override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.center = self.view.center
    view.addSubview(self.textField)
    self.textField.text = "test"
}

Upvotes: 2

Related Questions