UITextField 和 UIDatePicker 可重用代码
UITextField and UIDatePicker reusable code
您好,您在 reddit 上找到了这段代码,它将文本字段的键盘更改为 UIDatepicker
,因此我们可以 select 约会。该代码效果很好。但是,我正在尝试重构它以使其可重复使用,因为我在同一个 VC 上有 3 个文本字段,它们都需要能够 select 日期。这是代码
class ViewController: UIViewController {
@IBOutlet weak var txtDatePicker: UITextField!
let datePicker = UIDatePicker()
override func viewDidLoad() {
super.viewDidLoad()
showDatePicker()
}
func showDatePicker(){
//Formate Date
datePicker.datePickerMode = .date
//ToolBar
let toolbar = UIToolbar();
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker));
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
txtDatePicker.inputAccessoryView = toolbar
txtDatePicker.inputView = datePicker
}
@objc func donedatePicker(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
txtDatePicker.text = formatter.string(from: datePicker.date)
self.view.endEditing(true)
}
@objc func cancelDatePicker(){
self.view.endEditing(true)
}
}
这是我尝试过的方法,但我在通过 #selector
传递参数时遇到问题
class ViewController: UIViewController {
@IBOutlet weak var txtDatePicker: UITextField!
let datePicker = UIDatePicker()
override func viewDidLoad() {
super.viewDidLoad()
showDatePicker(textField: txtDatePicker)
}
func showDatePicker(textField: UITextField){
//Formate Date
datePicker.datePickerMode = .date
//ToolBar
let toolbar = UIToolbar();
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker(textField:)));
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
textField.inputAccessoryView = toolbar
textField.inputView = datePicker
}
@objc func donedatePicker(textField: UITextField){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
textField.text = formatter.string(from: datePicker.date)
self.view.endEditing(true)
}
@objc func cancelDatePicker(){
self.view.endEditing(true)
}
}
对于这种情况,我建议您使用 自定义 UITextField
。
class CustomTextField: UITextField {
lazy var datePicker: UIDatePicker = {
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
return datePicker
}()
lazy var toolBar: UIToolbar = {
let toolbar = UIToolbar()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker))
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
toolbar.sizeToFit()
return toolbar
}()
override init(frame: CGRect) {
super.init(frame: frame)
addDatePicker()
}
func addDatePicker() {
inputAccessoryView = toolBar
inputView = datePicker
}
@objc func donedatePicker(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
text = formatter.string(from: datePicker.date)
endEditing(true)
}
@objc func cancelDatePicker() {
endEditing(true)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
注意:我没有检查过你的代码。我刚刚以最佳方式重构了自定义 class.
您好,您在 reddit 上找到了这段代码,它将文本字段的键盘更改为 UIDatepicker
,因此我们可以 select 约会。该代码效果很好。但是,我正在尝试重构它以使其可重复使用,因为我在同一个 VC 上有 3 个文本字段,它们都需要能够 select 日期。这是代码
class ViewController: UIViewController {
@IBOutlet weak var txtDatePicker: UITextField!
let datePicker = UIDatePicker()
override func viewDidLoad() {
super.viewDidLoad()
showDatePicker()
}
func showDatePicker(){
//Formate Date
datePicker.datePickerMode = .date
//ToolBar
let toolbar = UIToolbar();
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker));
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
txtDatePicker.inputAccessoryView = toolbar
txtDatePicker.inputView = datePicker
}
@objc func donedatePicker(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
txtDatePicker.text = formatter.string(from: datePicker.date)
self.view.endEditing(true)
}
@objc func cancelDatePicker(){
self.view.endEditing(true)
}
}
这是我尝试过的方法,但我在通过 #selector
传递参数时遇到问题class ViewController: UIViewController {
@IBOutlet weak var txtDatePicker: UITextField!
let datePicker = UIDatePicker()
override func viewDidLoad() {
super.viewDidLoad()
showDatePicker(textField: txtDatePicker)
}
func showDatePicker(textField: UITextField){
//Formate Date
datePicker.datePickerMode = .date
//ToolBar
let toolbar = UIToolbar();
toolbar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker(textField:)));
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker));
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
textField.inputAccessoryView = toolbar
textField.inputView = datePicker
}
@objc func donedatePicker(textField: UITextField){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
textField.text = formatter.string(from: datePicker.date)
self.view.endEditing(true)
}
@objc func cancelDatePicker(){
self.view.endEditing(true)
}
}
对于这种情况,我建议您使用 自定义 UITextField
。
class CustomTextField: UITextField {
lazy var datePicker: UIDatePicker = {
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
return datePicker
}()
lazy var toolBar: UIToolbar = {
let toolbar = UIToolbar()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(donedatePicker))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelDatePicker))
toolbar.setItems([doneButton,spaceButton,cancelButton], animated: false)
toolbar.sizeToFit()
return toolbar
}()
override init(frame: CGRect) {
super.init(frame: frame)
addDatePicker()
}
func addDatePicker() {
inputAccessoryView = toolBar
inputView = datePicker
}
@objc func donedatePicker(){
let formatter = DateFormatter()
formatter.dateFormat = "dd/MM/yyyy"
text = formatter.string(from: datePicker.date)
endEditing(true)
}
@objc func cancelDatePicker() {
endEditing(true)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
注意:我没有检查过你的代码。我刚刚以最佳方式重构了自定义 class.