Swift - 奇怪的编码兼容错误

时间:2014-08-21 15:05:54

标签: ios xcode swift xcode-storyboard

我遇到了问题,我在网上找不到其他人同样的挣扎,也许这太傻了。

我有以下课程:

class UIXOColourPicker : UIView {
    @IBInspectable var moodValue: Int!
    ...
}

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

enter image description here

用户定义的运行时属性是由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开发人员来看看它。

干杯

2 个答案:

答案 0 :(得分:14)

@IBInspectable使用cocoa对象而不是本机swift类型。因此,任何不可隐式转换为swift类型的东西都需要成为可可对象。对于NumberBool,您需要NSNumber。对于PointSizeRect等内容,您需要使用NSValue。但是,对于String,您可以直接使用String;您不需要使用NSString

因此,在您的情况下,您需要使用NSNumber而不是Int。如果未在storyboard / xib中设置该值,我还会使用NSNumber?代替NSNumber!

@IBInspectable var moodValue: NSNumber?

更新

正如@JakeLin和@Echelon指出的那样,对于int类似的值,Xcode只会在Attributes Inspector中显示属性,如果你将它声明为Int?,但它会在运行时崩溃。如果使用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
    }
}

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

答案 1 :(得分:6)

这取决于moodValue的类型。似乎KVO系统无法处理所需的类型强制;它正在寻找具有实际类型moodValue的{​​{1}}。改变

NSNumber

@IBInspectable var moodValue: Int!

然后选择@IBInspectable var moodValue: NSNumber! 应该做你想做的事。