在一个简单的ViewController中,我添加了一个UIButton。 我想使用“用户定义的运行时属性”。现在我添加了默认的Bool属性。
按钮是@IBOutlet:
@IBOutlet var button:UIButton!
故事板中的链接已完成。
我的应用程序中没有其他内容。
我收到了这个错误:
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类:
@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.
答案 0 :(得分:30)
好吧,你的按钮没有名为keyPath
的属性来设置它。
用户定义的运行时属性用于在Interface Builder中简单地设置属性值。
您可以使用每个UIButton
都有的标准媒体资源,例如backgroundColor
:
或者,您可以创建自定义UIButton
子类,向其添加属性,然后将按钮的类设置为创建的自定义子类,并在“用户定义的运行时属性”部分中设置属性值。
例如,您可以查看此答案,它包含具有用户定义的运行时属性的自定义类的示例:https://stackoverflow.com/a/24433125/3445458
编辑:确保您没有为该类型使用可选(或隐式展开的可选),它不适用于用户定义的运行时属性(我猜因为Interface Builder不知道是否可以将值设置为nil,因此在选项中显示或不显示。)
所以你做不到
var keyPath: Bool!
相反,你只能做
var keyPath: Bool = false
或者不使用默认值,而是在构造函数中设置它。出于某种原因,它适用于可选的String
(在示例中,它们使用可选的String
),但它不适用于可选的Bool
。总而言之,不要过多使用或担心用户定义的运行时属性,在代码中设置默认值会更清楚!
希望这有帮助!祝你好运!
答案 1 :(得分:10)
由于该线程在我寻找解决方案时出现了大约5次,因此我想在这里发布修复程序,以供将来沮丧的人使用。我一直收到此错误的原因是,如果您正在尝试使用旧的IBInspectable属性,则Interface Builder不会清除它们。
在我的情况下,我从一个名为type
的Int属性开始,并在屏幕上设置了一些自定义按钮以使用值3作为测试。后来,我将其更改为更有意义的属性名称,并使其成为字符串,然后设置其中一些。但是当我运行该应用程序时,我收到了此消息。
直到去身份检查器并发现我仍然有一些按键使用旧的键路径和值时,我才发现错误:
删除旧的密钥路径可以解决此问题。
答案 2 :(得分:1)
在用户定义的运行时属性中,使用layer.cornerRadius
而不是cornerRadius
。
答案 3 :(得分:0)
好像无法将keyPath
布尔值设置为true或false。
将setKeyPath设置为true或false!
答案 4 :(得分:0)
比较 @IBInspectable (在子类中)和 Key Path (身份检查器)。删除不在@IBInspectable中的键值。
答案 5 :(得分:0)
在 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