我遇到了问题,我在网上找不到其他人同样的挣扎,也许这太傻了。
我有以下课程:
class UIXOColourPicker : UIView {
@IBInspectable var moodValue: Int!
...
}
在我的故事板中,我有一个像这样的观点:
用户定义的运行时属性是由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开发人员来看看它。
干杯
答案 0 :(得分:14)
@IBInspectable
使用cocoa对象而不是本机swift类型。因此,任何不可隐式转换为swift类型的东西都需要成为可可对象。对于Number
或Bool
,您需要NSNumber
。对于Point
,Size
,Rect
等内容,您需要使用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!
应该做你想做的事。