如何在Swift中正确设置TextField的背景颜色和文本颜色

时间:2017-10-27 16:26:47

标签: swift uitextfield uiswitch

请不要标记为重复,因为我似乎有一个错误,通常的代码不起作用。我浏览了所有可用的线程,但没有找到解决方案。

我有以下单元格:

enter image description here

关闭UISwitch后,我希望UITextField变暗,文字颜色变亮。当打开相反方向以模拟“禁用”行为时。

我的代码:

func setTextFieldActivation(isOn: Bool) {

    self.theTextField.isUserInteractionEnabled = isOn

    self.theTextField.set(

        bgColor: isOn ? Colors.moreLightGrey : Colors.leastLightGray, //Colors is a global struct of UIColor to cache reused colors
        placeholderTxt: String(),
        placeholderColor: isOn ? Colors.black : Colors.white,
        txtColor: isOn ? Colors.black : Colors.white
    )
}

扩展程序set

extension UITextField {


    func set(bgColor: UIColor, placeholderTxt: String, placeholderColor: UIColor, txtColor: UIColor) {

        self.backgroundColor = bgColor
        self.attributedPlaceholder = NSAttributedString(string: placeholderTxt, attributes: [NSForegroundColorAttributeName: placeholderColor])
        self.textColor = txtColor
    }
}

问题:当我打开UISwitch时,背景颜色会根据需要更改,但文字颜色仍然存在。

enter image description here

奇怪的部分:当我点击UITextField并成为第一响应者时,文本颜色会改变为我想要的颜色。

enter image description here

但是当我再次关闭开关时,颜色仍然很暗。

enter image description here

我错过了什么?非常感谢帮助。

PS:Xcode 9,Swift 3.

每当更改开关时都会调用代码:

self.theSwitch.addTarget(self, action: #selector(switchChanged), for: .valueChanged)

func switchChanged(mySwitch: UISwitch) {

    self.setTextFieldActivation(isOn: mySwitch.isOn)
}

1 个答案:

答案 0 :(得分:3)

我想我明白了。有线的事情是textColor直到layoutSubviews()才会更新。我尝试了两种似乎可以解决问题的方法。

第一种方法是直接在layoutSubviews()方法的末尾调用set

func set(bgColor: UIColor, placeholderTxt: String, placeholderColor: UIColor, txtColor: UIColor) {

    backgroundColor = bgColor
    attributedPlaceholder = NSAttributedString(string: placeholderTxt, attributes: [NSForegroundColorAttributeName: placeholderColor])
    textColor = txtColor

    layoutSubviews()
}

第二种方法是将UITextField的文本设置为当前值,该值也会触发layoutSubviews()

func set(bgColor: UIColor, placeholderTxt: String, placeholderColor: UIColor, txtColor: UIColor) {

    backgroundColor = bgColor
    attributedPlaceholder = NSAttributedString(string: placeholderTxt, attributes: [NSForegroundColorAttributeName: placeholderColor])
    textColor = txtColor

    let newText = text
    text = newText
}