我正在尝试向UIView添加IBInspectable
颜色,以便我可以在故事板中设置它,然后在代码中使用它。在this post regarding UITextField我已经看到我可以利用扩展和添加计算属性,但我无法使其适用于UIView。
我遇到了崩溃:无法在(UIView)上设置(additionalColor1)用户定义的检查属性:[setValue:forUndefinedKey:]:此类不是键值additionalColor1的键值编码。
知道是什么导致了崩溃以及如何解决它?
这是我的代码:
extension UIView {
@IBInspectable var additionalColor1: UIColor? {
return self.additionalColor1
}
}
作为参考,我粘贴了可用于为UITextField设置占位符颜色的代码(与上面的url相同)。这没关系:
extension UITextField {
@IBInspectable var placeHolderColor: UIColor? {
get {
return self.placeHolderColor
}
set {
self.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: newValue!])
}
}
}
答案 0 :(得分:4)
如问题标题中所述
Swift扩展程序只能将计算属性添加到某个类型,但无法添加存储的属性。
(有关详细信息,请参阅Extension中的The Swift Programming Language章节。)
您发布的示例实际上存在缺陷 - 即使此时它在Stackoverflow上有50个upvotes。如果从属性的getter返回属性本身的值,则表示您正在创建循环。
@IBInspectable var additionalColor1: UIColor? {
return self.additionalColor1
}
如果您有view
,并且尝试在代码中的任何位置访问view.additionalColor1
,则会调用属性的getter返回self.additionalColor1
- 或者换句话说:它返回属性的值再次 - 猜猜怎么样?通过调用propery的吸气剂! (依此类推......)
你提到的帖子中的例子只是“有效”,因为getter显然从未被调用过。只有设置的计算属性placeHolderColor
会更改另一个存储的属性,即文本字段的attributedPlaceholder
。
因此,虽然您可以通过扩展程序将计算属性添加到现有类,但您永远不会将其视为存储在某处的具体值。计算属性仅可用于以某种方式转换为其分配的值,并将结果存储在现有存储的属性中。
答案 1 :(得分:1)
您的additionalColor
将如何使用?
我最近不得不做类似的事情,但在我的情况下,我总是立即应用额外的价值。
例如,我想创建一个看起来像平行四边形的按钮。所以,我想要一种在Storyboard中放入一个值的方法,它将应用CGAffineTransform。我并没有真正存储偏斜值,只是用来改变事物的样子。然后,在get
中,我从视图的affineTransform
例程中传回值。
@IBInspectable var skewOffset: Float {
set(newSkewOffset) {
let affineTransform : CGAffineTransform = CGAffineTransform(a: 1.0, b: 0.0, c: CGFloat(newSkewOffset), d: 1.0, tx: 0.0, ty: 0.0)
layer.setAffineTransform(affineTransform)
}
get {
return Float(layer.affineTransform().c)
}
}
所以,我没有存储skewOffset
,我正在应用它,而且如果我需要的话,我知道如何在以后查找它。