无法在 (UIButton) 上设置 () 用户定义检查 属性

Failed to set () user defined inspected property on (UIButton)

在一个简单的 ViewController 中,我添加了一个 UIButton。 我想使用 "User Defined Runtime Attributes"。现在我添加了默认的 Bool 属性。

按钮是一个@IBOutlet:

@IBOutlet var button:UIButton!

故事板中的 link 已完成。

我的应用程序中没有其他内容。

我收到这个错误:

2017-03-26 20:31:44.935319+0200 ISAMG[357:47616] Failed to set (keyPath) user defined inspected property on (UIButton): 
[<UIButton 0x15e3a780> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.

我不明白我错过了什么。

编辑 1

按照@timaktimak 的建议,我创建了一个自定义 UIButton class:

@IBDesignable
class ChoiceButton: UIButton {

    @IBInspectable var keyPath: Bool! {
        didSet {
            print("didSet viewLabel, viewLabel = \(self.keyPath)")
        }
    }

    required init(coder aDecoder: NSCoder)  {
        super.init(coder: aDecoder)!
    }
}

错误相同:

2017-03-26 22:32:27.389126+0200 ISAMG[429:71565] Failed to set (keyPath) user defined inspected property on (ISAMG.ChoiceButton): 
[<ISAMG.ChoiceButton 0x14e8f040> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.

好吧,你的按钮没有一个叫做 keyPath 的 属性 来设置它。

用户定义的运行时属性用于在界面生成器中简单地设置一个 属性 值。

您可以使用每个 UIButton 都有的标准 属性,例如 backgroundColor:

或者,您可以创建自定义 UIButton 子class,向其添加 属性,然后将按钮的 class 设置为创建的自定义子class 并在用户定义的运行时属性部分设置 属性 值。

例如,您可以查看此答案,它包含一个自定义示例 class,具有用户定义的运行时属性:

编辑: 确保您没有为该类型使用可选(或隐式解包可选),它不适用于用户定义的运行时属性(我猜是因为接口Builder不知道该值是否可以设置为nil,所以在options中显示或不显示)。

所以你做不到

var keyPath: Bool!

相反你只能做

var keyPath: Bool = false

或者不使用默认值,而是在构造函数中设置它。出于某种原因,它适用于可选的 String(在示例中,他们使用可选的 String),但不适用于可选的 Bool。总结一下,不要过度使用或担心User Defined Runtime Attributes,在代码中设置默认值更清晰!

希望这对您有所帮助!祝你好运!

在用户定义的运行时属性中使用 layer.cornerRadius 而不是 cornerRadius

因为这个帖子在我寻找解决方案的过程中出现了大约 5 次,所以我想 post 在这里为未来沮丧的灵魂修复。我一直收到此错误的原因是,如果您正在试验它们,Interface Builder 不会清理旧的 IBInspectable 属性。

在我的例子中,我从一个名为 type 的 Int 属性 开始,并在我的屏幕上设置了几个自定义按钮以使用值 3 作为测试。后来改成更有意义的属性名字,做成字符串,然后设置其中的几个。但是当我 运行 应用程序时,我收到了这条消息。

我没有发现这个错误,直到我去了身份检查器并注意到我仍然有一个旧的键路径和一些按钮正在使用的值:

删除旧的键路径解决了问题。

似乎未能将 keyPath 布尔值设置为 true 或 false。 setKeyPath 为 true 或 false!

比较 @IBInspectable(子class)和关键路径 (身份检查员)。删除不在@IBInspectable 中的键值。

另一种在 Interface Builder 中设置 属性 值的方法是在视图控制器上创建视图的 IBOutlet。

@IBOutlet weak var yourView: UIView!


yourView.layer.shadowOffset = CGSize(width: 0, height: 1)
yourView.layer.shadowColor = UIColor.lightGray.cgColor
yourView.layer.shadowOpacity = 1
yourView.layer.shadowRadius = 5
yourView.layer.masksToBounds = false
yourView.layer.cornerRadius = 20