带有IB_DESIGNABLE的UIButton会引发运行时属性警告,并且不会在Interface Builder中呈现

我正在运行Xcode 6.1,而且我已经在IBInspectable上使用了IB_DESIGNABLE,已经有很多项目了,但是突然之间它就不能工作了。 我已经创build了子类button,将图像和标题垂直居中放置在上面,并使用户能够通过使用IBInspectable的IB设置边框宽度和颜色。

下面的警告被logging下来,并且我的代码在drawRect中没有预览可用:

warning: IB Designables: Ignoring user defined runtime attribute for key path "spacingBetweenLabelAndImage" on instance of "UIButton". Hit an exception when attempting to set its value: [<UIButton 0x7f9278591260> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key spacingBetweenLabelAndImage. 

尽pipe如此,运行时呈现像我打算渲染,它也尊重我已经通过IB添加相同的自定义间距。

下面是重新排列button和标题的menubutton的代码:

 #import "HamburgerButton.h" IB_DESIGNABLE @interface HamburgerImageButton : HamburgerButton @property IBInspectable CGFloat spacingBetweenLabelAndImage; @end 

执行:

 #import "HamburgerImageButton.h" @implementation HamburgerImageButton - (void)drawRect:(CGRect)rect { [super drawRect:rect]; CGSize imageSize = self.imageView.frame.size; CGSize titleSize = self.titleLabel.frame.size; // Move the label left and the image right by half the width CGFloat leftInset = titleSize.width / 2; CGFloat rightInset = imageSize.width / 2; CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; CGFloat topInset = imageSize.height / 2 + halfSpacing; CGFloat bottomInset = titleSize.height / 2 + halfSpacing; UIEdgeInsets imageInsets = UIEdgeInsetsMake(-bottomInset, leftInset, bottomInset, -leftInset); UIEdgeInsets titleInsets = UIEdgeInsetsMake(topInset, -rightInset, -topInset, rightInset); self.imageEdgeInsets = imageInsets; self.titleEdgeInsets = titleInsets; } @end 

你可能已经注意到它inheritance了HamburgerButton。 这个基本的汉堡包button没有图像,只能在button周围绘制边框。 这个基本的汉堡包button具有完全相同的问题:它不会在IB中的drawRect中绘制边框,并且它具有相同types的错误。 为了完整起见,这里是代码:

 #import <UIKit/UIKit.h> IB_DESIGNABLE @interface HamburgerButton : UIButton @property IBInspectable CGFloat borderWidth; @property IBInspectable UIColor *borderColor; @end 

执行:

 #import "HamburgerButton.h" #import <QuartzCore/QuartzCore.h> @implementation HamburgerButton - (void)copyInspectables { self.layer.borderWidth = self.borderWidth; self.layer.borderColor = self.borderColor.CGColor; } - (void)drawRect:(CGRect)rect { [self copyInspectables]; } @end 

我不明白为什么它只是抛出一个警告,没有别的。 我没有真正改变我所做的。 我已经检查了故事板,这是iOS 7和以上,意味着运行在Xcode 6(最新)。

它抱怨无法在UIButton上find这个值,这有点奇怪,因为我已经把它分类了。


更新:所以我改变了一切,它的工作。 现在,它再次发生,没有改变任何东西。 我认为在Xcode 6.1中有一个错误…:/

我一直在广泛地使用实况视图,因为它的引入和最初的Xcode很多新function一样,它有一些缺陷。 尽pipe如此,我仍然喜欢它,我希望它能在新版本中得到改进。

原因:

实时视图与@property属性一起工作,得到一个特殊的IB_Designable标签,它将通过用户定义的运行时属性为UI类提供额外的属性,这些属性将通过属性检查器设置。 您会看到所有这些属性都存在于Identity Inspector中。 问题的根本原因是它无法将这些用户定义的运行时属性映射到公开的属性。

只要打开使用IB_Designable的Storyboard或xib,如果您打开了“自动刷新视图”,则Xcode将在每次更改时重新编译屏幕。 由于您的代码也会影响您的用户界面,因此在Interface Builder本身中不必进行更改。

在更快的机器上使用更简单的项目,这在大多数情况下工作得相当好。 对于具有更多IB_Designable的大型项目,CPU没有足够的容量来跟上你,并且在渲染UI时会出现一些超时错误。 这是“警告:IBdevise的原因:忽略用户定义的关键path的运行时属性”spacingBetweenLabelAndImage“在”UIButton“的实例。尝试设置其值:命中时出现exception:[setValue:forUndefinedKey:]:这个类是而不是键值间距关键字标记和图像的关键值编码。“ 错误。

它也不会用你的自定义代码更新你的用户界面。 当你运行它时,这不是一个问题,因为在运行时它会反映这些变化。

另一个原因可能是你的代码在后台编译时不能编译。 当你在处理代码的时候,这是不可避免的,所以经常触发它。

解:

我们需要确保您的自定义视图类再次编译,以便可以通过Interface Builder成功设置属性

  • 在故事板中,转到顶部栏菜单中的“编辑器”
  • 如果仍然打开,请取消select“自动刷新视图”
  • closures所有的故事板标签
  • 重build项目
  • 修复所有生成错误,如果有的话
  • 重新打开你的故事板。
  • 再次转到“编辑器”,然后点击“刷新所有视图”

警告应该消失,如果它工作之前,你会再次看到你的自定义视图的代码。

在sunkas发表评论之后:在任何奇怪问题持续存在的情况下彻底清理您的解决scheme总是一个非常好的主意。

我个人如何解决这个问题:

在用户定义的运行时属性的身份检查器中,我注意到我有一个旧的IB_Inspectable元素,它从我的代码中删除,但它仍然在那里。 使用 – button删除它摆脱了这个错误。

identityinspector

尝试将您的“ CGFloat ”声明的spacingBetweenLabelAndImage为“ NSNumber ”。

据我所知, 你不能在C型variables上调用“ setValue: ” 。

将“ spacingBetwenLabelAndImage ”的声明更改为NSNumber还需要更改一些代码:

 CGFloat halfSpacing = self.spacingBetweenLabelAndImage == 0 ? 0 : self.spacingBetweenLabelAndImage / 2; 

可能会变成这样:

 CGFloat halfSpacing = (self.spacingBetweenLabelAndImage ? ([self.spacingBetweenLabelAndImage floatValue] / 2) : 0.0); 

(如果这是第一行的完美翻译,我不是100%确定的,但是我想要展示如何从NSNumber中获取floatValue)

我用方法Departamento B提供,但它并没有真正的工作。 但是,我解决了我的问题1.从故事板select错误的意见2.点击(编辑器 – debugging选定的视图)希望这会有所帮助

如果您确定所有设置器都正确,并且在项目中导入了其他一些SDK,并且出现此问题,请检查Target – General中的“链接的框架和库”。

在我正确地连接了一些SDK框架之后,错误消失了。

我有类似的问题,但我实际上从课堂上删除了财产,Interface Builder仍然抱怨缺less的财产,艰难。

尝试了许多事情,如清洁,重build…但没有任何工作!

真正解决的是右键单击故事板文件,select“打开为”,然后select“源代码”。 这在编辑器中打开了故事板XML内容,我能够find引用缺less的属性,直到我find部分:

 <userDefinedRuntimeAttributes> <userDefinedRuntimeAttribute... keyPath="My Missing Property Name"> ... </userDefinedRuntimeAttributes> 

删除整个部分后,我保存了该文件,并刷新了Interface Builder中的视图。 现在所有的警告都消失了!

我有这个错误,当有两个目标。 一个与我的主要项目和其他与目标,我举行devise类(为更快的构build)。
问题在于故事板中缺less一个模块。

在这里输入图像说明