【问题标题】:Swift - Weird coding-compliant errorSwift - 奇怪的编码兼容错误
【发布时间】:2014-08-21 15:05:54
【问题描述】:

我遇到了一个问题,我在网上找不到其他人有同样的困难,也许这太傻了。

我有以下课程:

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

在我的故事板中,我有一个这样的视图:

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

*** 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 开发人员可以查看它。

干杯

【问题讨论】:

    标签: ios xcode swift xcode-storyboard


    【解决方案1】:

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

    因此,在您的情况下,您需要使用NSNumber 而不是Int。我也会使用NSNumber? 而不是NSNumber!,以防您的故事板/xib 中未设置该值。

    @IBInspectable var moodValue: NSNumber?
    

    更新

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

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

    IBInspectable[66994:58722469] 无法在 (q25429792___IBInspectable.ViewController) 上设置 (moodValue) 用户定义的检查属性:[ 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。

    【讨论】:

    • @IBInspectable 不支持 NSNumber,它不会出现在 Interface Builder 中。
    • 我真的很困惑。 @JakeLin 是正确的 - 当设置为 NSNumber 时,我的 @IBInspectables 不会出现在属性检查器中(只有用户定义的运行时属性中的原始键路径)。当我使用Int 时,它们确实会出现,但它们会引发运行时异常。
    • @Echelon 和 @JackLin,我用不同的解决方法更新了答案,让您可以使用 Int 以便它显示在属性检查器中。
    【解决方案2】:

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

    @IBInspectable var moodValue: Int!
    

    @IBInspectable var moodValue: NSNumber!
    

    然后选择moodValue.integerValue 应该做你想做的事。

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 2012-12-27
      • 1970-01-01
      • 2020-07-31
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多