我有一个自定义UIView
组件,其中包含UITextField
,UIImageView
和另一个UIView
。
我需要更改UITextField
的行为,以便在点按时显示UIDatePicker
。这是我正在尝试执行的代码,但由于某种原因,datePicker在被点击时不会打开:
class TextFieldWithFeedback : UIView {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var underlineView: UIView!
override func draw(_ rect: CGRect) {
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
self.textField.inputView = datePicker
}
}
当我在我的ViewController(下面的代码)上使用相同的代码时,它起作用了:
override func viewDidLoad() {
super.viewDidLoad()
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
customView.textField.inputView = datePicker
}
现在,这个解决方案有效,但它并不理想,因为我有8个自定义视图,最好设置一次而不是8次。
我应该使用View类的哪个方法来设置datePicker?因为绘制不起作用。
另外,当用户选择日期时,如何附加函数来修改UITextField
值?
答案 0 :(得分:1)
管理解决这个问题:
//To control whether or not to use the DatePicker, easily customized on the Storyboard
@IBInspectable var useDatePicker: Bool = false
@IBAction func textFieldEditing(_ sender: UITextField) {
self.textFieldStartedEditing(sender: sender)
}
func textFieldStartedEditing(sender: UITextField) {
if useDatePicker {
let datePickerView:UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = .date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged)
}
}
func datePickerValueChanged(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/YYYY"
self.textField.text = dateFormatter.string(from: sender.date)
}
我的customView类中的所有代码。
如果其他人遇到麻烦并需要帮助随时发表评论,我保证我会比评论该问题的人更有帮助:)
答案 1 :(得分:0)
你需要做的是将addTarget添加到Textfield,然后在方法中显示UIPickerView
self.textField.addTarget(self, action: #selector(ViewController.openDatesPicker), for: .touchDown)
您还应该为文本字段设置标记,以便稍后在代码中识别它。您还应该实现此方法,以阻止键盘显示
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField.tag == 2 {
return true
} else {
return false
}
}