如何将UIDatePicker的背景颜色设置为UITextField inputView?

时间:2017-07-05 18:19:27

标签: ios swift uitextfield uidatepicker

请勿将其标记为重复。可用的答案没有回答我的问题。

我使用UIDatePicker作为UITextField's inputViewUITableViewCell内):

@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)

}

问题:只有第二次调用选择器时,颜色才会改变。

enter image description here enter image description here

我想,发生此问题是因为inputView是可选的,只有在第二次调用选择器时,inputView才会在我想要更改颜色的时刻实例化。 / p>

我尝试将UITextField作为子类并观察inputView

class DateTextField: UITextField {

    override var inputView: UIView? {

        didSet {

            self.inputView?.backgroundColor = Colors.CI1
            self.reloadInputViews()

        }

    }

}

不幸的是没有成功。相同的行为。我错过了什么?非常感谢帮助。

6 个答案:

答案 0 :(得分:2)

您可以将以下库用于自定义颜色https://github.com/prolificinteractive/PIDatePicker

答案 1 :(得分:2)

错误在于我在Interface Builder中设置了键盘外观。一旦回到default,它就会像预期的那样工作。

enter image description here

答案 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,如果您修改它,}将再次查看。

答案 5 :(得分:1)

此代码对我有用

func textFieldDidBeginEditing(_ textField: UITextField) {   
        let picker = UIDatePicker()
        picker.datePickerMode = .date

        textField.inputView = picker
        textField.inputView?.backgroundColor = UIColor.blue

}

Screenshot

即使在第一次编辑时,它也显示为蓝色。

此外:

您可以在viewDidLoad方法中创建选择器实例,设置其背景颜色,为其添加标签,然后使用委托方法中的标记访问此选择器,而不是在那里创建变量,而不是在textField委托方法中创建选取器实例