请勿将其标记为重复。可用的答案没有回答我的问题。
我使用UIDatePicker
作为UITextField's
inputView
(UITableViewCell
内):
@IBOutlet weak var theTextField: UITextField!
func textFieldDidBeginEditing(_ textField: UITextField) {
let picker = UIDatePicker()
picker.setValue(Colors.CI2, forKeyPath: "textColor")
picker.datePickerMode = .date
textField.inputView = picker
textField.inputView?.backgroundColor = Colors.CI1 // my desired color
picker.addTarget(self, action: #selector(datePickerValueChanged), for: .valueChanged)
}
问题:只有第二次调用选择器时,颜色才会改变。
我想,发生此问题是因为inputView
是可选的,只有在第二次调用选择器时,inputView
才会在我想要更改颜色的时刻实例化。 / p>
我尝试将UITextField
作为子类并观察inputView
。
class DateTextField: UITextField {
override var inputView: UIView? {
didSet {
self.inputView?.backgroundColor = Colors.CI1
self.reloadInputViews()
}
}
}
不幸的是没有成功。相同的行为。我错过了什么?非常感谢帮助。
答案 0 :(得分:2)
您可以将以下库用于自定义颜色https://github.com/prolificinteractive/PIDatePicker
答案 1 :(得分:2)
答案 2 :(得分:1)
创建一个保存日期选择器颜色的函数,并在textFieldDidBeginEditing
中调用它。我认为这应该可以解决你的问题。
答案 3 :(得分:1)
所以你提到这个文本字段在UITableViewCell
范围内...我建议将第一个代码块添加到UITextFieldDelegate
然后再添加到tableView(_:willDisplay:forRowAt:)
函数中UITableViewDelegate
,将文本字段的代理设置为自定义UITextFieldDelegate
。
如果不了解更多代码结构,我只能为您提供非常通用的实现:
@IBOutlet weak var theTextField: UITextField!
//Add your customisation to the textField...
extension ViewController : UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
let picker = UIDatePicker()
picker.setValue(Colors.CI2, forKeyPath: "textColor")
picker.datePickerMode = .date
textField.inputView = picker
textField.inputView?.backgroundColor = Colors.CI1 // my desired color
picker.addTarget(self, action: #selector(datePickerValueChanged), for: .valueChanged)
}
}
extension ViewController : UITableViewDelegate {
//Set the delegate when the UITableViewCell appears:
func tableView(_ tableView: UITableView,
willDisplay cell: UITableViewCell,
forRowAt indexPath: IndexPath) {
let dateCell = = self.tableView.dequeueReusableCellWithIdentifier("cell") as! DateCell
dateCell.delegate = self
return dateCell
}
}
答案 4 :(得分:1)
请勿在{{1}}中更改inputView
。您最后一次更改textFieldDidBeginEditing()
属性位于textField.inputView
。
至于最佳做法:您应将textFieldShouldBeginEditing()
配置的所有代码移至创建textView.inputView
的地方,以执行一次性配置。例如:
textView
如果您需要在屏幕上每次更改override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// get the cell
// get your instance of textField
// ...
// Configure everything you want about your input view
let picker = UIDatePicker()
picker.setValue(Colors.CI2, forKeyPath: "textColor")
picker.datePickerMode = .date
picker.backgroundColor = Colors.CI1
textField.inputView = picker // <-- You just have to assign this ONCE
// ... Continue your setup ...
return cell
}
时更改其配置,请在inputView
中更改textView.inputView = ...
。< / p>
<小时/>
在您的代码中(当您在textFieldShouldBeginEditing(){ ... }
中进行更改时),显示的textField DID BeginEditing
始终是之前创建的UIDatePicker
。在创建textField
实例时,似乎设置了灰色的(但未配置)。
在textFieldDidBeginEditing()
中,系统已经绘制了textView.inputView
和,如果您修改它,1}}属性1>}将再次查看。
答案 5 :(得分:1)
此代码对我有用
func textFieldDidBeginEditing(_ textField: UITextField) {
let picker = UIDatePicker()
picker.datePickerMode = .date
textField.inputView = picker
textField.inputView?.backgroundColor = UIColor.blue
}
即使在第一次编辑时,它也显示为蓝色。
此外:
您可以在viewDidLoad方法中创建选择器实例,设置其背景颜色,为其添加标签,然后使用委托方法中的标记访问此选择器,而不是在那里创建变量,而不是在textField委托方法中创建选取器实例