首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UILabel textColor扩展

UILabel textColor扩展
EN

Stack Overflow用户
提问于 2018-04-13 16:55:58
回答 2查看 1.8K关注 0票数 0

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

我想在代码中初始化UILabel时激活它,如下所示:

代码语言:javascript
复制
lazy var labelValue: UILabel! = {
        let lb = UILabel()
        lb.activateUpDown = true
        return lb
    }()

这是我创建的扩展:

代码语言:javascript
复制
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,它可以工作,但这不是我想要的地方。

代码语言:javascript
复制
override func updateConstraints() {
        if(shouldSetupConstraints) {
            shouldSetupConstraints = false
        }
        super.updateConstraints()
        labelValue.activateUpDown = true
    }

是否有可能以我想要的方式创建扩展,还是我的想法是胡说八道?

编辑:基本上,我想要的是更改textColor的设置,如果activateUpDown设置为true,而有人将textColor设置为值。它检查值是否为正/负/零。

最后,我做了一个UILabel的子类:

代码语言:javascript
复制
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
    }
    */

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-13 17:33:41

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

创建一个属性

代码语言:javascript
复制
var textColorObservation : NSKeyValueObservation?

和观察者

代码语言:javascript
复制
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为隐式未包装可选。很明显,您正在返回一个非可选对象。

票数 5
EN

Stack Overflow用户

发布于 2018-04-13 17:19:15

您不能在扩展中创建存储的属性,而这正是困扰您的原因。最好编写一个UILabel子类。然后解决办法会落在你的腿上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49821862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档