UILabel textColor扩展

时间:2018-04-13 16:55:59

标签: swift uilabel uicolor textcolor

我想为UILabel创建一个扩展,我想修改UILabel类以自动检查文本值是否为positiv / negativ / cero,然后自动设置颜色。

我想在我的代码中初始化UILabel时激活它:

lazy var labelValue: UILabel! = {
        let lb = UILabel()
        lb.activateUpDown = true
        return lb
    }()

这是我创建的扩展程序:

extension UILabel {
    var activateUpDown: Bool {
        set {
            if activateUpDown == true {
               textColor = colorUpDown(value: text)
            }
        }
        get {
            return true
        }
    }

    func colorUpDown(value: String?) -> UIColor {
        let valueDouble = Double(value ?? "0") ?? 0
        var output:UIColor = .black
        if valueDouble < 0 {
            output = .red
        } else {
            if valueDouble > 0 {
                output = .green
            } else {
                output = .black
            }
        }
        return output
    }
}

当我在初始化期间将activateUpDown设置为true时,它不起作用。

如果我输入updateConstraints它可以工作,但这不是我想要的地方。

override func updateConstraints() {
        if(shouldSetupConstraints) {
            shouldSetupConstraints = false
        }
        super.updateConstraints()
        labelValue.activateUpDown = true
    }

是否可以按照我想要的方式创建扩展程序,或者我的想法是无意义的?

编辑: 基本上我想要的是我想要更改textColor的Setter,如果activateUpDown设置为true并且有人将textColor设置为值。它检查值是否为positiv / negativ / zero。

我最终做了一个UILabel的子类:

import UIKit

class CustomUILabel: UILabel {

    var activateUpDown = false


    var textValue: String? {
        willSet(newValue){
            text = newValue
            if activateUpDown == true {
            textColor = colorUpDown(value: newValue)
            }
        }
    }

    func colorUpDown(value: String?) -> UIColor {
        let valueDouble = Double(value ?? "0") ?? 0
        var output:UIColor = .black
        if valueDouble < 0 {
            output = .red
        } else {
            if valueDouble > 0 {
                output = .green
            } else {
                output = .black
            }
        }
        return output
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

}

2 个答案:

答案 0 :(得分:5)

或者利用Swift 4的新键值观察技能,不需要UILabel的扩展

创建属性

var textColorObservation : NSKeyValueObservation?

和观察员

textColorObservation = labelValue.observe(\.text, options: [.new])  { (label, change) in
    guard let text = change.newValue!, let doubleValue = Double(text) else { return }
    switch doubleValue {
       case ..<0: label.textColor = .red
       case 0: label.textColor = .black
       default: label.textColor = .green
    }
}

旁注:

不要将labelValue声明为隐式解包的可选项。您显然正在返回一个非可选对象。

答案 1 :(得分:3)

您无法在扩展程序中创建存储的媒体资源,这就是您在这里搞砸了什么。你最好不要编写UILabel的子类。然后解决方案将落入你的膝盖。