这个类不符合@IBInspectable的键值编码兼容性。

11

我在自定义视图上创建了一个@IBDesignable,以便从IB设置属性。但是尽管我在类中有该属性,但我收到了不符合关键值编码的类的错误提示。

@IBDesignable class ExclusiveSelectorView: UIView {
    @IBInspectable var cellWidth: CGFloat?
}

无法在(Test.ExclusiveSelectorView)上设置(cellWidth)用户定义的检查属性: [setValue:forUndefinedKey:]:此类不支持键值编码键cellWidth。

输入图像描述

这是我的类 输入图像描述


那个展示自定义类部分的屏幕截图,是针对视图还是文件所有者? - The Beanstalk
2
你可能需要明确定义变量的setter和getter方法,请查看此网站http://nshipster.com/ibinspectable-ibdesignable/。 - The Beanstalk
似乎如果我不使用setter/getter保留默认值也可以工作,所以我会保持这种方式!因此基本上@IBInspectable var cellWidth:CGFloat = 0而不是可选。 - Godfather
可以尝试使用@IBInspectable var cellWidth: CGFloat!,但如果没有问题就不要修复它。 - The Beanstalk
1个回答

10

@IBInspectable的基本类型无法定义为可空。

如果您尝试这样做,并为其中一个属性设置值,则将在IBDesignable时间收到以下警告:

@IBDesignable类TestDesignable IB Designables:忽略运行时用户定义的关键路径“testInt”的属性在“TestDesignable”的实例上。在尝试设置其值时遇到异常:[setValue:forUndefinedKey:]:此类不支持键值编码,用于键testInt。

并且在运行时,您将收到以下错误:

无法将(testInt)用户定义的检查属性设置为(TestDesignable)上的属性:[setValue:forUndefinedKey:]:此类不支持键值编码,用于键testInt。

要解决此问题,请将其从可选项更改为非可选项,并给它一些零默认值。

无效的:

@IBDesignable class TestDesignable: UIView {
  @IBInspectable var testInt: Int? = nil // crash
  @IBInspectable var testFloat: CGFloat? = nil // crash
  @IBInspectable var testPoint: CGPoint? = nil // crash
  @IBInspectable var testColor: UIColor? = nil
}

合法的:

@IBDesignable class TestDesignable: UIView {
  @IBInspectable var testInt: Int = 0
  @IBInspectable var testFloat: CGFloat = 0
  @IBInspectable var testPoint: CGPoint = .zero
  @IBInspectable var testColor: UIColor? = nil
}

为什么 @IBInspectable var testColor: UIColor? = nil 可以为空?如果一开始你说了:“你不能将基元类型定义为空值,以用于@IBInspectables。” - Santiago Carmona González
2
@Santiagocarmonagonzález 人们通常将“值类型”称为基元类型。UIColor是引用类型,它可以是nil。简而言之,可设计的对象必须在Obj-C中可表示,而只有引用类型可以是nil - Sulthan
2
我会给你一亿分,因为你帮我解决了这个超级棘手的问题。自从Swift发布以来,我几乎在每个项目中都遇到了这个“bug”。谢谢! - atlex2
即使我已经初始化了基本类型,我仍然收到“IBDesignable time”警告。 - Anjan Biswas

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