无法在UIView中设置@IBInspectable计算属性

时间:2017-02-19 23:35:36

标签: swift uiview ibinspectable

我正在尝试向UIView添加IBInspectable颜色,以便我可以在故事板中设置它,然后在代码中使用它。在this post regarding UITextField我已经看到我可以利用扩展和添加计算属性,但我无法使其适用于UIView。

Identity inspector enter image description here

我遇到了崩溃:无法在(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!])
        }
    }
}

2 个答案:

答案 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,我正在应用它,而且如果我需要的话,我知道如何在以后查找它。