如何更改设置为 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,它就会像预期的那样工作。