IB_DESIGNABLE,IBInspectable – 接口生成器不更新

我有以下一组代码:

CustomView.h

#import <UIKit/UIKit.h> IB_DESIGNABLE @interface CustomView : UIView @property (nonatomic) IBInspectable UIColor *borderColor; @property (nonatomic) IBInspectable CGFloat borderWidth; @property (nonatomic) IBInspectable CGFloat cornerRadius; @end 

CustomView.m

 #import "CustomView.h" @implementation CustomView - (void)setBorderColor:(UIColor *)borderColor { _borderColor = borderColor; self.layer.borderColor = borderColor.CGColor; } - (void)setBorderWidth:(CGFloat)borderWidth { _borderWidth = borderWidth; self.layer.borderWidth = borderWidth; } - (void)setCornerRadius:(CGFloat)cornerRadius { _cornerRadius = cornerRadius; self.layer.cornerRadius = cornerRadius; } @end 

(对于Swift引用,这个问题也出现在Swift代码中)

CustomView.swift

 @IBDesignable class CustomView : UIView { override init(frame: CGRect) { super.init(frame: frame) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } @IBInspectable var borderColor : UIColor = UIColor.clearColor() { didSet { self.layer.borderColor = borderColor.CGColor } } @IBInspectable var borderWidth : CGFloat = 0.0 { didSet { self.layer.borderWidth = borderWidth } } @IBInspectable var cornerRadius : CGFloat = 0.0 { didSet { self.layer.cornerRadius = cornerRadius } } } 

我添加了一个UIView到故事板上的视图控制器,并将其子类设置为CustomView

在这里输入图像说明

这增加了“Designables”行。 它被卡在“更新”,工具提示“等待目标build立”。 它从此不会改变。

当我移动到属性检查,我能够设置这些IBInspectable属性:

在这里输入图像说明

一旦设置,它们也出现在“用户定义的运行时属性”中:

在这里输入图像说明

然而,“devise”状态永远不会超越“更新”,仍然是相同的工具提示(我试过Cmd + Bbuild设几次,没有任何改变)。

而且,因为我设置了IBInspectable属性,所以我得到了每个警告:

IBDesignables – 在“UIView”实例上忽略关键path“borderColor”的用户定义的运行时属性…该类不是关键值编码兼容的关键borderColor。

生成警告的屏幕截图:

在这里输入图像说明


我熟悉的键值编码兼容的问题,一般知道如何解决它们…但我不明白如何解决这个问题在这里。 根据视图的身份检查员,该视图是一个“CustomView”(不是一个普通的“UIView”,它没有这些属性)。 如果视图不是“CustomView”,那么这些可devise的属性将不会显示在属性检查器中,对吗? 但是,当Interface Builder尝试将这些属性应用于视图时,可以回想到视图的类是“UIView”,并且不能应用这些属性。

任何帮助? 请让我知道,如果我已经遗漏了一些重要的细节,但为了什么是值得的, 我完全按照这个教程 (除了ObjC vs Swift)。 还有一点值得注意的是,我在另一台机器上完全按照本教程进行了操作,它的工作原理类似于一个魅力(我打算昨天晚上发表这篇文章,但是当时的计算机没有这个问题)。


根据评论,有人build议,也许.m文件不包括在内,这可能会导致问题。 我想我肯定会这样做,但是我也检查过。

在这里输入图像说明

当我第一次尝试这样做时,我了解到IB_DESIGNABLE类必须是不同的UIKit框架的一部分。 所以从第一个截图中,你可以看到我build立了一个“CustomViews”框架,它有一个类CustomView 。 您还会在这里看到我也创build了一个与CustomView完全相同的CustomView ,除非它不在单独的框架中。 然而,两个课程之间的故事情节仍然存在相同的问题。

这里我们有一个屏幕截图,指出CustomView.m包含在CustomViews框架中:

在这里输入图像说明

同时,下面的截图显示了几件事情:

  • CustomViews.framework适当地包含在主项目中。
  • OtherView.m也作为一个编译源包含在内,所以即使CustomViewOtherView也能正常工作,但是它会产生相同的错误。
  • Main.storyboardLaunchScreen.xib显示为红色。 我不知道为什么,也没有丝毫的线索,为什么LaunchScreen.xib应该(我没有触及这个文件),虽然我可以看看其他项目后, Main.storyboard也显示为红色那些项目,我没有在IB_DESIGNABLEIBInspectable那里做任何事情。

在这里输入图像说明


我已经尝试了几次,并重新尝试。 它每次在我家里的电脑上都能正常工作 – 我无法在家里重现这个问题。 在工作中,它从来没有工作。 这个问题中描述的问题每次都会发生。

这两款电脑都是Mac Minis今年新买的(不是新款,2012年末的型号)。 这两台电脑都运行OS X Yosemite 10.10。 这两台电脑都运行Xcode版本6.1。 在家里,这个版本是(6A1052d)。 今天早上,我可以确认两台电脑都运行相同的Xcode版本。

其他人向我暗示,这可能是坏RAM。 这似乎牵强附会给我。 我多次重新启动项目,多次重新启动计算机。 在我看来,如果在大约6个月大的计算机上出现坏的内存,我会看到其他问题,而且这个问题不太一致。 但是确切的问题仍然存在,尽pipe无数次重新启动整个项目从头开始,并在计算机上完全重新启动。


值得注意的是,如果我实际编译并运行这个项目,带有IBInspectable属性的自定义视图实际上显示为我期望故事板显示它。 我想,即使没有IB_DESIGNABLEIBInspectable指令,情况也是如此,因为这些指令是作为用户定义的运行时属性创build的。

根据chrisco的build议debugging选定的视图(我已经做了,但去了一个很好的措施再试一次),我注意到编辑器菜单底部的其他选项。

  • 自动刷新视图
  • 刷新所有视图

我点击“刷新所有视图”后,Xcode有点想法,突然故事板显示我的意见,如预期(正确应用我的IBInspectable属性)。

在这里输入图像说明

然后我再次经历了整个过程,以确认这是解决scheme。

我创build了一个新类ThirdView 。 这个class级和其他人一样。 我将视图的类更改为ThirdView并且稍微有所不同:

在这里输入图像说明

点击“显示”给我的警告:

在这里输入图像说明

这个新的一个:

使用类UIView的对象与自定义类,因为类ThirdView不存在。

这并不比现有的更有帮助。 另外,现在其他三个警告奇怪地加倍了6。

无论如何,如果我再次从编辑器下拉菜单中单击“刷新所有视图”,所有的错误消失,并再次正确显示视图。

不过,到目前为止,我所做的一切都是我从来没有在家里搞过的东西。 在家里,它只是工作。 所以我打开了“自动刷新视图”,并创build了一个“FourthView”来再次testing,与前三个相同。

将视图的类更改为“FourthView”后,可devise的标签在短时间内表示“更新”,然后最后说“最新”:

在这里输入图像说明

所以,我在家里检查了我的电脑。 总是在工作的计算机上打开“自动刷新视图”。 在没有的电脑上关掉了。 我永远不会记得触摸这个菜单选项。 我甚至无法确定在Xcode 6之前它是否已经存在。但是这个选项是造成这种差异的原因。


TL; DR,如果问题中描述的问题相同,请确保“自动刷新视图”处于打开状态(或者在需要更新IB时手动“刷新所有视图”):

在这里输入图像说明

我有一些更多的细节,可能会导致您的IBDesignable类不加载。

select您的自定义视图应该显示您有问题的故事板/ xib。

在导航区中,转到XCode工作区/项目中的Report Navigator。

在XCode的编辑器菜单中,点击(如nhgrif所述),“刷新所有视图”选项。 这将导致IB启动一个大量的东西,我敢肯定,不会期望的编译。

在Report Navigator中,点击“By Group”来过滤内容并查看“Interface Builder”部分。 你会看到为了加载自定义的IBDesignable视图框架,它会编译很多东西。 如果这些目标中的任何一个不能编译,比如(或许不赞成)unit testing目标(即使它们与载入这些视图或故事板的代码完全无关),那么IB在加载你的dll时将会失败。

就我而言,IB试图编译8个目标,其中包括4个unit testing,这些unit testing在最近的重构变化之后还没有被更新,我们一直在努力。

我已经做了大部分的代码更改/修复,以便IB正确加载和显示我的海关视图,这些视图与这些类无关甚至是链接,也不会在运行这些unit testing的过程中加载故事板。 然而,IB对整个工作区的编译依赖于它的工作。

对于有这个问题的其他人,请记住指定variables的types。

 // Doesn't show up in IB @IBInspectable var includeLeftSection = true // Shows now that it knows the type @IBInspectable var includeLeftSection : Bool = true 

成为其他任何人都会遇到IB Designables类不存在的错误,原因和我一样。 顶部的答案不是我的问题…但这里是一个稍有关系的问题…

隐藏在故事板源代码customModule中的一个属性。

例如,我有一个名为ForwardArrow的类,在一个单独的框架内,我不小心添加到我的主要目标。

因此,一些视图的XML结束为customClass =“ForwardArrow”customModule =“MainTargetNameWasHere”

当我从构build主目标中移除它们时,故事板没有将MainTargetNameWasHere更新为它所在的框架CustomViews,并开始给出没有find类的错误。

所以TLDR; 确保如果您的IBDesignable在另一个框架中,故事板中的customModule xml属性设置为正确的值。 如果它根本就没有添加它。

来自我的源代码示例:

 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews"> 

我有相同的警告Ignoring user defined runtime attribute for key path ..即使我绝对相信我没有做我的自定义IBDesignable视图类的任何错误。

原来,在我的情况下,这与Xcodecaching有关。

 rm -rf ~/Library/Developer/Xcode/DerivedData/* 

清除DerivedData并且警告消失了。

就我的例子而言,我通过pod使用了CheckboxButton ,checkbox的graphics从来没有出现在故事​​板中,而我在这里得到了同样的问题:

警告:IB Designables:使用类UIView作为自定义类的对象,因为类CheckboxButton不存在

警告:IB Designables:在“UIView”实例上忽略用户定义的关键path“checkColor”的运行时属性。 尝试设置其值时发生exception:[setValue:forUndefinedKey:]:此类不是关键字checkColor的编码兼容值。

解决我的问题的方法是提供名称为CheckboxButton的模块,如下所示:

注意:您应该将CheckboxButtonreplace为您正在使用的模块的名称。

我个人通过使用“ – ”button来删除身份检查员的内容,从而解决了这个问题。 当您删除自定义类,更改IB中的内容,然后添加一个新的自定义类,身份检查器中的可devise元素不会被删除,并导致我有这个错误。 只需删除一切,重build。 在这里输入图像说明

我知道这是回答,但这是一个更多的经验。

我遇到了一些与此问题无关的问题,但是在这个过程中,我从类中的variables中删除了@IBInspectable,并从身份检查器(alt-apple-3)中删除了属性。

在解决组件的(代码)问题之后,我刷新了所有的东西,但在身份检查器中仍然没有任何属性。

最后,我注意到他们回来了, 但只在属性检查器(alt-apple-4)中 。 只要我在那里给他们增加了价值,他们就重新出现在身份检查员身上

上面的答案给了我(反向)解决scheme,而不是其他人(派生数据,编辑器>刷新)做了,但为了清楚起见,人们不知道在哪里编辑XML …你不'不需要!

  1. 在故事板文件中select麻烦的视图
  2. 在右侧边栏中select“身份检查器”选项卡(左侧第三个选项)。
  3. 你将有你的自定义类,它应该已经被设置,和Module 。 对我来说这是空的,我得到了与OP一样的错误。 我将Module设置为我的项目名称和BAM – 它在重build之后开始工作!

我刚刚经历了这个问题的响声。 我尝试了所有列在这里和其他地方没有任何运气的东西。 这是一个故事板,永远正常工作,并突然停止与“忽略用户定义的运行时属性…”的问题。

不pipe出于什么原因,从我的一个IBDesignable中删除这个代码就可以解决这个问题:

 -(void)viewDidLoad { self.clipsToBounds = YES; } 

删除这些会导致所有警告消失,即使在其他IBDesignable对象中也是如此。 我不知道为什么这一步固定它,但也许它也会帮助别人。

我有同样的问题,我不得不改变cornerRadius和BorderWidth是一个string,然后将其转换为CGFloat,这是唯一的解决scheme,我能够改变的价值观,并看到在界面生成器的变化。

 @IBInspectable var borderColor: UIColor? { didSet { layer.borderColor = borderColor!.CGColor } } @IBInspectable var borderWidth: String? { didSet { layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0) } } @IBInspectable var cornerRadius: String? { didSet { layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0) layer.masksToBounds = layer.cornerRadius > 0 } }