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

cmi*_*mii 8 uibutton user-defined ios swift

在一个简单的ViewController中,我添加了一个UIButton.我想使用"用户定义的运行时属性".现在我添加了默认的Bool属性.

屏幕

按钮是@IBOutlet:

@IBOutlet var button:UIButton!
Run Code Online (Sandbox Code Playgroud)

故事板中的链接已完成.

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

我收到了这个错误:

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.
Run Code Online (Sandbox Code Playgroud)

我不明白我错过了什么.

编辑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)!
    }
}
Run Code Online (Sandbox Code Playgroud)

画面2

错误是一样的:

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.
Run Code Online (Sandbox Code Playgroud)

tim*_*mak 31

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

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

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

在此输入图像描述

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

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

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

所以你做不到

var keyPath: Bool!
Run Code Online (Sandbox Code Playgroud)

相反,你只能这样做

var keyPath: Bool = false
Run Code Online (Sandbox Code Playgroud)

或者不使用默认值,而是在构造函数中设置它.由于某种原因,它适用于可选项String(在示例中它们使用可选项String),但它不具有可选项Bool.总而言之,不要过多使用或担心用户定义的运行时属性,在代码中设置默认值会更清楚!

希望这可以帮助!祝好运!


Jus*_*ney 15

由于此线程在我寻找解决方案时出现了大约5次,因此我想在这里发布修复程序,以供将来沮丧的人使用。我一直收到此错误的原因是,如果您正在尝试使用旧的IBInspectable属性,则Interface Builder不会清除它们。

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

我去了身份检查器并发现我仍旧使用了一些按钮的键路径和值后才发现错误:

在此处输入图片说明

删除旧的密钥路径可以解决此问题。

  • 非常感谢!就我而言,它起到了作用。 (2认同)