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

Ios 无法在(UIButton)上设置()用户定义的已检查属性,ios,swift,uibutton,user-defined,Ios,Swift,Uibutton,User Defined,在一个简单的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 inspecte

在一个简单的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.

错误是相同的:

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.
2017-03-26 22:32:27.389126+0200 ISAMG[429:71565]未能在(ISAMG.ChoiceButton)上设置(keyPath)用户定义的已检查属性:
[setValue:forUndefinedKey:]:此类不符合密钥路径的密钥值编码。

好吧,您的按钮没有一个名为
keyPath
的属性来设置它

用户定义的运行时属性仅用于在界面生成器中设置属性值

您可以使用每个
ui按钮
都具有的标准属性,例如
backgroundColor

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

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

编辑:确保您没有对该类型使用可选(或隐式取消包装可选),它不适用于用户定义的运行时属性(我猜是因为界面生成器不知道该值是否可以设置为nil,因此是否在选项中显示)

所以你不能这么做

var keyPath: Bool!
相反,你只能这样做

var keyPath: Bool = false
或者不要使用默认值,而是在构造函数中设置它。出于某种原因,它与可选的
字符串
(在本例中,它们使用可选的
字符串
),但与可选的
Bool
不兼容。总之,不要过多地使用或担心用户定义的运行时属性,在代码中设置默认值更清晰


希望这有帮助!祝你好运

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

因为这个线程在我搜索解决方案时出现了大约5次,所以我想在这里发布我的修复程序,以备将来使用。我不断出现此错误的原因是,如果您正在试验旧的IBInspectable属性,Interface Builder不会清理它们

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

我没有发现错误,直到我去了Identity Inspector并注意到我仍然有一个旧的键路径和值用于某些按钮:


删除旧的密钥路径修复了该问题。

看起来无法将
密钥路径的布尔值设置为true或false。

将keypath设置为true或false

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

在界面生成器中设置set a属性值的另一种方法是在视图控制器上创建视图的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

PS我知道这并不能直接解决OP的问题。只是作为一项公共服务发布在这里,因为谷歌认为这是唯一可行的地方。很好的答案,顺便问一下,我们从中学到了什么?不要在原型(测试/实验/或其他)版本中使用
@IBInspectable
,让我们仅在项目或组件完成后将其添加到属性中。谢谢你,汉克斯!这正是我从原型中删除不再需要的属性后所需要的。
@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