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

问题描述:

我试图将一个IBInspectable颜色添加到UIView中,以便我可以在故事板中设置它并稍后在代码中使用它。在this post regarding UITextField我见过我可以利用扩展并添加一个计算属性,但我不能让它适用于UIView。无法在UIView中设置@IBInspectable计算属性

Identity inspector enter image description here

我得到一个崩溃:无法设置(additionalColor1)用户定义的检查上(UIView的)属性:[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

* self.additionalColor1 *如何设置?如果它在代码中,设计时工具如何执行它? – dfd

+0

应在故事板中设置Afaik'self.additionalColor1'。我粘贴的图片显示我已将其设置为身份检查员。在我粘贴的剪辑中,我没有推动二传手。但是,将'self.additionalColor1 = newValue'添加到setter仍然会导致崩溃。 – Andrej

+1

我很困惑。我原来的评论(很快被删除)也询问您是否可以将IBInspectable放入扩展中。然后我注意到你声称你可以(placeHolderColor)。因此,假设它可以,为什么你不同的编码additionalColor1?你有一个明确的getter/setter在一个,但不是另一个。并且(我认为)如果您为additionalColor1删除了IBInspectable概念,那么您已经编写了一个只读属性。 – dfd

正如在你的问题中提到的标题

斯威夫特扩展只能添加计算性质的类型,但它们不能添加存储性能

(有关详细信息,请参阅ExtensionThe Swift Programming Language。)

您发布的例子实际上是有缺陷的 - 即使它在这个时候#2 50个upvotes。如果您从属性的getter中返回属性本身的值,那么您正在创建一个循环。

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

如果你有一个view,并尝试在任何地方访问view.additionalColor1在你的代码的属性的getter将被调用返回self.additionalColor1 - 或者换句话说:它再次返回该属性的值 - 你猜怎么样?通过调用propery的getter! (依此类推......)

你提到的只是“作品”的帖子中的例子,因为吸气者显然从未被调用过。这只是设置计算属性placeHolderColor改变另一个存储的属性,即文本字段的attributedPlaceholder

因此,尽管你可以通过添加扩展计算属性以现有的类可以从未把它看作是某处存储在一个具体的数值。计算属性只能用于以某种方式转换您分配给它的值,并将结果存储在现有存储的属性中。

+1

我们应该downvote或编辑链接的有缺陷的递归答案。 –

您的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,我申请了,我知道我能看它以后,如果我需要得到它。