我想为UILabel创建一个扩展,我想修改UILabel类,以自动检查文本值是否为正/负/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的设置,如果activateUpDown设置为true,而有人将textColor设置为值。它检查值是否为正/负/零。
最后,我做了一个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
}
*/
}发布于 2018-04-13 17:33:41
或者,利用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为隐式未包装可选。很明显,您正在返回一个非可选对象。
发布于 2018-04-13 17:19:15
您不能在扩展中创建存储的属性,而这正是困扰您的原因。最好编写一个UILabel子类。然后解决办法会落在你的腿上。
https://stackoverflow.com/questions/49821862
复制相似问题