Reputation: 733
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
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