如何更改设置为 UITextField inputView 的 UIDatePicker 的背景颜色?
How to change background color of UIDatePicker set as UITextField inputView?
请不要标记为重复。可用的答案没有回答我的问题。
我将 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
才会在我想要更改颜色的那一刻被实例化.
我尝试将 UITextField
子类化并观察 inputView
。
class DateTextField: UITextField {
override var inputView: UIView? {
didSet {
self.inputView?.backgroundColor = Colors.CI1
self.reloadInputViews()
}
}
}
遗憾的是没有成功。相同的行为。我错过了什么?非常感谢帮助。
创建一个保存日期选择器颜色的函数,并在 textFieldDidBeginEditing
中调用它。我认为这应该可以解决您的问题。
所以你提到这个文本字段在 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
}
}
不要在 textFieldDidBeginEditing()
中更改 inputView
。您最后一次可以更改 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
必须在屏幕上显示 时需要更改 inputView
的配置,请在 textFieldShouldBeginEditing(){ ... }
.
为什么它不起作用
在您的代码中(当您在 textField DID BeginEditing
中进行更改时),显示的 UIDatePicker
始终是之前创建的代码。似乎在您创建 textField
实例时设置了灰色的(但未配置)。
在textFieldDidBeginEditing()
中,系统已经绘制了textView.inputView
,不会再看inputView
属性 如果你修改它。
您可以使用以下库来自定义颜色 https://github.com/prolificinteractive/PIDatePicker
这段代码对我有用
func textFieldDidBeginEditing(_ textField: UITextField) {
let picker = UIDatePicker()
picker.datePickerMode = .date
textField.inputView = picker
textField.inputView?.backgroundColor = UIColor.blue
}
即使在第一次编辑时它也显示为蓝色。
另外:
您可以在 viewDidLoad 方法中创建选择器,设置它的背景颜色,给它一个标签,然后在委托方法中使用标签访问这个选择器,而不是创建那里有变量。
错误是我在 Interface Builder 中设置了键盘外观。一旦设置回 default
,它就会像预期的那样工作。
请不要标记为重复。可用的答案没有回答我的问题。
我将 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
才会在我想要更改颜色的那一刻被实例化.
我尝试将 UITextField
子类化并观察 inputView
。
class DateTextField: UITextField {
override var inputView: UIView? {
didSet {
self.inputView?.backgroundColor = Colors.CI1
self.reloadInputViews()
}
}
}
遗憾的是没有成功。相同的行为。我错过了什么?非常感谢帮助。
创建一个保存日期选择器颜色的函数,并在 textFieldDidBeginEditing
中调用它。我认为这应该可以解决您的问题。
所以你提到这个文本字段在 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
}
}
不要在 textFieldDidBeginEditing()
中更改 inputView
。您最后一次可以更改 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
必须在屏幕上显示 时需要更改 inputView
的配置,请在 textFieldShouldBeginEditing(){ ... }
.
为什么它不起作用
在您的代码中(当您在 textField DID BeginEditing
中进行更改时),显示的 UIDatePicker
始终是之前创建的代码。似乎在您创建 textField
实例时设置了灰色的(但未配置)。
在textFieldDidBeginEditing()
中,系统已经绘制了textView.inputView
,不会再看inputView
属性 如果你修改它。
您可以使用以下库来自定义颜色 https://github.com/prolificinteractive/PIDatePicker
这段代码对我有用
func textFieldDidBeginEditing(_ textField: UITextField) {
let picker = UIDatePicker()
picker.datePickerMode = .date
textField.inputView = picker
textField.inputView?.backgroundColor = UIColor.blue
}
即使在第一次编辑时它也显示为蓝色。
另外:
您可以在 viewDidLoad 方法中创建选择器,设置它的背景颜色,给它一个标签,然后在委托方法中使用标签访问这个选择器,而不是创建那里有变量。
错误是我在 Interface Builder 中设置了键盘外观。一旦设置回 default
,它就会像预期的那样工作。