我有UIView扩展,我想用它来添加渐变层。
我知道我无法在扩展中创建类型为CAGradientLayer
(或任何其他类型...)的存储属性,因此我想在UIView本身中创建gradientLayer属性(扩展中没有)和而不是检查扩展是否存在此属性。
所以我要求:
extension UIView
{
private var gradientLayer:CAGradientLayer?
{
return value(forKey: "gradientLayer") as? CAGradientLayer
}
func addGradient()
{
guard gradientLayer != nil else
{
return
}
// do something with the layer
}
}
当此属性存在时,一切正常,但是否则应用程序崩溃并显示错误:
valueForUndefinedKey:]:此类不符合键值编码 对于梯度梯度层。
是否可以在不崩溃应用程序的情况下以这种方式知道属性是否存在?
答案 0 :(得分:1)
子类UIView并实现valueForUndefinedKey:
,以便它可以执行除崩溃之外的其他操作。
但是,我会采用完全不同的方式;我将额外的信息存储在视图的层中。图层可以在任何键下存储信息,如果您询问不存在的密钥,则不会崩溃。