Swift - 奇怪的编码兼容错误

Mar*_*rte 9 xcode ios xcode-storyboard swift

我遇到了问题,我在网上找不到其他人同样的斗争,也许这太傻了.

我有以下课程:

class UIXOColourPicker : UIView {
    @IBInspectable var moodValue: Int!
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的故事板中,我有一个像这样的观点:

在此输入图像描述

用户定义的运行时属性是由Xcode IBInspectable功能生成的(这真的很酷btw),但每当我尝试运行应用程序时,我都会收到错误

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIXOColourPicker 0x7fa86877c420> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key moodValue.'

我在Xcode 6 - Beta 6上.

有任何想法吗?

对不起,如果这是一个愚蠢的问题,但我已经在努力了2个小时,我没有任何其他Swift开发人员来看看它.

干杯

Mik*_*e S 14

@IBInspectable使用cocoa对象而不是本机swift类型.因此,任何不可隐式转换为swift类型的东西都需要成为可可对象.为了NumberBool你需要NSNumber.这样的事情Point,Size,Rect,等等,你需要使用NSValue.但是,String你可以String直接使用; 你不需要使用NSString.

因此,在您的情况下,您需要使用NSNumber而不是Int.我也会使用NSNumber?NSNumber!不是在storyboard/xib中没有设置值.

@IBInspectable var moodValue: NSNumber?
Run Code Online (Sandbox Code Playgroud)

更新

正如@JakeLin和@Echelon指出的那样,对于int相似的值,Xcode只会在Attributes Inspector中显示属性,如果你将其声明为Int?,但它会在运行时崩溃.如果使用a NSNumber?,它将不会在运行时崩溃,但该属性将不再在Attributes Inspector中可用; 它只会显示在用户定义的运行时属性中(这对我来说似乎是Xcode中的一个错误).

错误本身告诉我们如何解决这个问题:

IBInspectable [66994:58722469]无法设置(moodValue)用户定义的检查属性(q25429792 ___ IBInspectable.ViewController):[setValue:forUndefinedKey:]:此类不是键值moodValue的键值编码兼容.

这就是说运行时无法在类上找到"键值编码兼容"属性moodValue(Int属性不符合键值编码),并且您可以实现setValue:forUndefinedKey:修复它.

在这种情况下,实现可能如下所示:

@IBInspectable var moodValue: Int?

override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    if let value = value as? Int? where key == "moodValue" {
        self.moodValue = value
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您确实希望属性显示在Attributes Inspector中,并且您不介意添加额外的方法,请将您的属性声明为Int?和实现setValue:forUndefinedKey:.如果您不想要额外的方法,则必须满足于使用NSNumber?和用户定义的运行时属性UI.


Ada*_*ght 6

这取决于您的类型moodValue.似乎KVO系统无法处理所需的类型强制; 它正在寻找moodValue具有实际类型的a NSNumber.更改

@IBInspectable var moodValue: Int!
Run Code Online (Sandbox Code Playgroud)

@IBInspectable var moodValue: NSNumber!
Run Code Online (Sandbox Code Playgroud)

然后挑出moodValue.integerValue应该做你想要的.