我想为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
}
*/
}
答案 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的子类。然后解决方案将落入你的膝盖。