2

我正在尝试向IBInspectableUIView 添加颜色,以便我可以在情节提要中设置它,然后在代码中使用它。在这篇关于 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!])
        }
    }
}
4

2 回答 2

5

如您的问题标题中所述

Swift 扩展只能将计算属性添加到类型,但不能添加存储属性

(有关更多详细信息,请参阅The Swift Programming Language中的扩展章节。)

您发布的示例实际上是有缺陷的——即使此时它在 Stackoverflow 上有 50 个赞成票。如果您从属性的 getter 返回属性本身的值,则您正在创建一个循环。

@IBInspectable var additionalColor1: UIColor? {
    return self.additionalColor1
}

如果您有 aview并且您尝试访问view.additionalColor1代码中的任何位置,您的属性的 getter 将被调用,它会返回self.additionalColor1- 或者换句话说:它再次返回属性的值 - 你猜怎么着?通过调用属性的吸气剂!(等等...)

您提到的帖子中的示例仅“有效”,因为显然从未调用过getter。它只是设置更改另一个存储属性的计算属性placeHolderColor,即文本字段的attributedPlaceholder.

因此,虽然您可以通过扩展将计算属性添加到现有类,但您永远不能将其视为存储在某处的具体值。计算属性只能用于以某种方式转换您分配给它的值并将结果存储在现有的存储属性中。

于 2017-02-20T00:33:43.613 回答
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,而是在应用它,而且我知道以后需要时如何查找它。

于 2017-06-08T15:46:44.187 回答