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

Posted

技术标签:

【中文标题】无法在 (UIButton) 上设置 () 用户定义的检查属性【英文标题】:Failed to set () user defined inspected property on (UIButton) 【发布时间】:2017-03-26 18:35:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

用户定义的运行时属性用于在 Interface Builder 中简单地设置属性值。

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

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

例如,您可以查看这个答案,它包含一个具有用户定义的运行时属性的自定义类的示例:https://***.com/a/24433125/3445458

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

所以你不能这样做

var keyPath: Bool!

你只能这样做

var keyPath: Bool = false

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

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

【讨论】:

【参考方案2】:

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

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

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

删除旧的 keypath 解决了这个问题。

【讨论】:

PS 我知道这并不能直接解决 OP 的问题。只是作为公共服务发布在这里,因为 Google 认为这是唯一可行的地方。 很好的答案,顺便说一句,我们从中学到了什么? 不要在原型(测试/实验/或其他)版本中使用 @IBInspectable,只有在您的项目或组件完成时才将其添加到属性中。谢谢大佬 谢谢!从原型中删除不再需要的属性后,正是我所需要的。【参考方案3】:

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

【讨论】:

【参考方案4】:

似乎未能将 keyPath bool 值设置为 true 或 false。 setKeyPath 为真或假!

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

在 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

【讨论】:

以上是关于无法在 (UIButton) 上设置 () 用户定义的检查属性的主要内容,如果未能解决你的问题,请参考以下文章

设置 UIButton alpha 在 iOS 7 上无法正常工作。

以编程方式在 UIButton 上设置目标/操作?

无法更改 UIButton 图像

以编程方式在UIButton上设置图像和文本

使用 CABasicAnimation 移动时无法使用 UIButton

如何使用 UIButton 为单元格设置动画?