请不要标记为重复,因为我似乎有一个错误,通常的代码不起作用。我浏览了所有可用的线程,但没有找到解决方案。
我有以下单元格:
关闭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
时,背景颜色会根据需要更改,但文字颜色仍然存在。
奇怪的部分:当我点击UITextField
并成为第一响应者时,文本颜色会改变为我想要的颜色。
但是当我再次关闭开关时,颜色仍然很暗。
我错过了什么?非常感谢帮助。
PS:Xcode 9,Swift 3.
每当更改开关时都会调用代码:
self.theSwitch.addTarget(self, action: #selector(switchChanged), for: .valueChanged)
func switchChanged(mySwitch: UISwitch) {
self.setTextFieldActivation(isOn: mySwitch.isOn)
}
答案 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
}