@IBDesignable - @IBInspectable,类不符合键值编码规范

10
我突然遇到了一个奇怪而可重复的错误,当使用@IBDesignable类时,@IBInspectable属性会给出以下警告:

Main.storyboard: 警告:IB Designables:忽略用户定义的运行时属性键路径“test”,在“UIButton”的实例上。在尝试设置其值时遇到异常:[ setValue:forUndefinedKey:]:此类不符合键值编码规范的键测试。

明确一下,在Xcode中,这个警告只是一个问题,它可以正常打包。但仍然很烦人! 复现步骤:
  1. Create new project
  2. Create a custom @IBDesignable UIButton subclass, with an @IBInspectable String property:

    import UIKit
    
    @IBDesignable
    class TempButton: UIButton {
        @IBInspectable var test:String = ""
    }
    
    1. Drag a Button to a View Controller in the storyboard, and give it the custom class "TempButton" in the Identity Inspector.
    2. Now the 'Test' attribute should appear in the Attributes Inspector for 'Temp Button' properties - type anything into this field.
    3. Bam! The above warning appears. Remove the text from the field, and the warning disappears.

我尝试了几种解决方案 - 不同的变量名称,将“test”属性设置为可选项,使用初始化程序,但迄今为止都没有成功。

这是问题的屏幕截图:

enter image description here


非常有趣,我无法重现这个问题。我按照你说的做了,没有警告。你使用的Xcode版本是什么?你记得先构建应用程序吗?你尝试重新启动计算机了吗(有时候可以帮助解决Xcode的问题)? - matt
已添加屏幕截图以帮助诊断问题,如果其他人无法复制。 - Craig Grummitt
1
好的屏幕截图。我看到我们的经验中有一个重要的区别:在你拖动按钮并更改其类之后,你的Designables会显示“正在更新”,但我的则显示“已更新”。这肯定是关键的不同点。- 你是否执行了通常的“清除缓存”操作? - matt
有趣的观察,你是对的,它卡在“更新”上。我已经清理并重建了项目,创建了新项目,但问题仍然存在 - 除了“清除缓存”之外,还有其他建议吗? - Craig Grummitt
1
嗨@amergin,最终我不得不放弃使用IBInspectable,这是一个很大的痛苦。我以为我是唯一忍受这种令人沮丧的Xcode怪癖的人,就像你说的那样。我尝试了Matt提供的清除缓存等每一个建议,但都没有帮助。 - Craig Grummitt
显示剩余5条评论
5个回答

9
我通过确保Interface Builder“构建”没有任何错误来解决了这个问题。这是什么意思:
  1. 在Xcode的左侧面板中,转到Report Navigator(顶部的最后一个选项卡)。
  2. 在报告列表中,选择您的目标之后,您应该看到“Interface Builder”。展开该项目。
  3. 确保没有任何项目出现错误(由红色X指定)。
  4. 如果在这里找到错误,请选择它,然后您将看到问题的更多细节。修复该问题,进行清理和重建。

请注意,问题与您正在处理的文件无关。似乎如果在构建相关文件之前,Interface Builder的构建失败,您将看到这些非常神秘的警告。

(我的问题最终是共享扩展目标错误地引用了AppIcon和SplashScreen资源目录。)


天啊!这意味着我必须在专门针对iOS9+的类中插入@available,并处理旧版本。为了使Storyboard正确加载,需要做很多工作。简直令人发指。 - nekonari
6
关闭 Xcode。清除 DerivedData 文件夹“/Users/..../Library/Developer/Xcode/DerivedData”,然后重新构建。 - Everton Cunha

8
我曾遇到同样的问题并解决了它。 当你打开storyboard时: 1. 点击上方菜单中的“编辑”。 2. 点击“刷新所有视图”。 3. 重启你的应用程序。 4. 构建。

这对我也适用于8.2.1版本。我想起最近在离线工作时关闭了自动刷新视图,以节省电池电量,因此可能问题来自于此,而且有一段时间没有刷新视图了。 - Natalia

1

我遇到了类似的问题,但在上面的答案中没有找到解决方案。 在我的情况下,身份检查器中错误地添加了一个额外的keyPath:

enter image description here


我花了两天时间“学习”如何使用过时的苹果在线文档构建自定义视图。在这个“棘手”的过程中,我进行了很多尝试(还包括属性重命名),似乎有些尝试会在不同的位置添加键值属性,就像你提到的那样。清除所有错误项后 - 主题消息消失了。谢谢。 - A. Petrov

0
如果你遇到这个问题,我解决的方法是重置视图的自定义类分配。以下是详细的步骤:
  1. 在Storyboard中选择有问题的视图。
  2. 打开位于Xcode界面右侧的Inspector面板。
  3. 导航到Identity Inspector,即Inspector面板的第四个选项卡。
  4. 在Identity Inspector中,你会看到一个名为“Custom Class”的部分。在“Class”字段中清除现有的类名。
  5. 一旦你删除了类名,重新分配它,通过将类名重新输入到“Class”字段中。当你开始输入时,Xcode应该会提供自动完成的建议。从列表中选择你的类。
这样可以有效地重置故事板视图与代码中相应类之间的链接,从而解决“Designable Build Failed”错误。

0

希望你不像我这么蠢,为了你自己的利益。我刚刚花了两个小时寻找解决方案。在我的情况下,我定义了一个指向BOOL的指针属性... 奇怪的是它给了我相同的错误。

我不得不从以下内容进行更改:

@property (nonatomic) IBInspectable BOOL *randomProp;

至:

@property (nonatomic) IBInspectable BOOL randomProp;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接