nhg*_*rif 89 interface-builder ios ibdesignable ibinspectable
我有以下代码集:
#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
#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代码也出现了这个问题)
@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"行.它停留在"正在更新",工具提示显示"等待目标构建".它永远不会改变这种状态.
当我移动到属性检查时,我能够设置这些IBInspectable属性:

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

但是,"Designables"状态永远不会超过"正在更新"仍然使用相同的工具提示(我已经尝试了几次Cmd + B,没有任何变化).
而且,当我设置IBInspectable属性时,我会收到每个属性的警告:
IBDesignables - 在"UIView"实例上忽略关键路径"borderColor"的用户定义的运行时属性...此类与键borderColor不符合键值编码.
生成的警告的屏幕截图:

我熟悉符合键值编码的问题,并且通常知道如何解决它们......但我不明白如何在这里解决这个问题.根据视图的身份检查器,视图是"CustomView"(不是常规的"UIView",它没有这些属性).如果视图不是"CustomView",那么这些可设计的属性不会出现在Attributes Inspector中,对吧?但是当Interface Builder尝试将这些属性应用于视图时,它会回过头来认为视图的类是"UIView"并且不能应用这些属性.
有帮助吗?如果我遗漏了一些重要的细节,请告诉我,但是为了它的价值,我完全按照本教程(除了ObjC vs Swift).值得注意的是,我在另一台机器上完全按照本教程操作,它就像一个魅力(我打算昨晚发布这个帖子,但我当时的电脑没有这个问题).
根据评论,有人建议可能.m不包含该文件,这可能导致问题.我当然认为我会为这种情况做好准备,但无论如何我都检查过了.

当我第一次尝试这样做时,我理解这些IB_DESIGNABLE类必须是不同UIKit框架的一部分.因此,从第一个截图中,您可以看到我设置了一个"CustomViews"框架,该框架有一个类CustomView.你还会在这里看到我也创建了一个OtherView,它是相同的CustomView,除了它不在一个单独的框架中.然而,两个类之间的故事板上仍然存在相同的问题.
这里我们有一个屏幕截图,表明它CustomView.m包含在CustomViews框架中构建:

同时,以下屏幕截图显示了几件事:
CustomViews.framework 适当包含在主项目中.OtherView.m也包含在一个编译源中,所以即使出现问题CustomView,也OtherView应该有效,但是它会产生相同的错误.Main.storyboard并LaunchScreen.xib显示为红色.我不明白为什么,并且没有丝毫的线索为什么LaunchScreen.xib应该(我没有触及过这个文件),虽然我可以在看完其他项目之后说,这些项目Main.storyboard也显示为红色,而我是没有做任何事情IB_DESIGNABLE或IBInspectable那里.
我现在已经尝试了几次并重试了这次.它每次都在家里的电脑上工作 - 我不能在家里重现这个问题中描述的问题.在工作中,它永远不会奏效.这个问题中描述的问题每次都会发生.
这两款电脑都是今年新推出的Mac Minis(不是新款,2012年末款).两台计算机都运行OS X Yosemite 10.10.两台计算机都运行Xcode版本6.1.在家里,建筑是(6A1052d).今天早上,我可以确认两台计算机都运行相同的Xcode版本.
其他人向我建议可能是RAM不好.这对我来说似乎遥不可及.我多次重启项目,多次重启计算机.对我来说,如果大约6个月大的计算机上存在坏RAM,我会看到其他问题,而且这个问题会不那么一致.但是,尽管多次从头开始重新启动整个项目并在计算机上完全重新启动,但这个确切的问题仍然存在.
值得注意的是,如果我实际编译并运行此项目,具有IBInspectable属性的自定义视图实际显示为我希望故事板显示它.我想,即使没有IB_DESIGNABLE和IBInspectable指令也是如此,因为它们被创建为用户定义的运行时属性.
nhg*_*rif 73
基于chrisco建议调试所选视图(我已经完成了,但又去尝试了一下),我注意到编辑器菜单底部还有其他两个选项.
我点击了"刷新所有视图",在Xcode有点思考之后,故事板突然显示了我的预期视图(正确应用我的IBInspectable属性).

然后我再次完成整个过程以确认这是解决方案.
我创建了一个新类ThirdView.这个类再次与其他类完全相同.我改变了我的视图类,ThirdView并且这次有了一些不同的东西:

点击"显示"给我的警告:

这次是新的:
将类UIView用于具有自定义类的对象,因为类ThirdView不存在.
这实际上并不比已经存在的更有帮助.此外,现在其他三个警告奇怪地加倍到6.
无论如何,如果我再次从编辑器下拉菜单中单击"刷新所有视图",则所有错误都会消失,并且视图会再次正确显示.
尽管如此,到目前为止,我所做的一切都是我在家里从未搞砸过的东西.在家里,它只是工作.所以我打开了"自动刷新视图"并创建了一个"FourthView"来测试 - 再一次,与前三个相同.
在将视图的类更改为"FourthView"后,designables标签在短时间内说"正在更新",然后最终说"最新":

所以,我在家检查了我的电脑.在自动运行的计算机上打开"自动刷新视图".它在计算机上被关闭了.我永远不记得触摸这个菜单选项了.我甚至不能确定它是否存在于Xcode 6之前.但是这个选项正在产生影响.
TL; DR,如果您遇到问题中描述的相同问题,请确保打开"自动刷新视图"(或在IB中需要更新时手动"刷新所有视图"):

Gol*_*Joe 22
只是快速提示其他有此问题的人:记得指定变量的类型.
// Doesn't show up in IB
@IBInspectable var includeLeftSection = true
// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true
Mar*_*oie 21
我还有一些细节可能会导致您的IBDesignable类无法加载.
选择您的自定义视图应显示的有问题的storyboard/xib.
在导航器区域中,转到XCode工作区/项目中的Report Navigator.
在XCode的Editor菜单中,点击(如nhgrif所述),"刷新所有视图"选项.这将导致IB为一大堆东西启动编译,我相信你不会期望这些东西.
在报告导航器中,单击"按组"以过滤内容并查看"界面生成器"部分.您将看到,为了加载自定义IBDesignable视图框架,它将编译很多东西.如果这些目标中的任何一个没有编译,例如(可能已弃用)单元测试目标(即使它们与加载这些视图或故事板的代码完全无关),那么IB将无法加载您的dll.
就我而言,IB试图编译8个目标,其中4个是自我们最近一直在进行的重构更改以来尚未更新的单元测试.
大多数代码更改/修复我已经完成,以便IB正确加载和显示我的海关视图,这些视图与这些类无关或甚至链接,也不会在运行这些单元测试的过程中加载故事板.然而,IB依赖整个工作空间来编译它的工作.
Ignoring user defined runtime attribute for key path ..即使我绝对确定我的自定义IBDesignable视图类没有做任何错误,我也有同样的警告.
原来,在我的情况下,它与Xcode缓存有关.
rm -rf ~/Library/Developer/Xcode/DerivedData/*
清除DerivedData和警告消失了.
任何其他人遇到错误IB Designables类不存在,原因和我一样.最佳答案不是我的问题......但这是一个有点相关的问题......
故事板源代码中隐藏了一个名为customModule的属性.
例如,我在一个单独的框架中有一个名为ForwardArrow的类,我意外地将其添加到我的主目标中.
因此,某些视图的XML最终为customClass ="ForwardArrow"customModule ="MainTargetNameWasHere"
当我从构建中的主目标中删除它们时,故事板没有将MainTargetNameWasHere更新为CustomViews,它是它所在的框架,并且开始给出没有找到类的错误.
TLDR; 如果您的IBDesignable位于另一个框架中,请确保故事板中的customModule xml属性设置为正确的值.如果它根本没有添加它.
我的来源示例:
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">
作为我的示例,我通过吊舱使用CheckboxButton,并且当出现以下问题中所述的相同问题时,复选框的图形从未显示在情节提要中:
警告:IB设计对象:将类UIView用于具有自定义类的对象,因为类CheckboxButton不存在
和
警告:IB设计变量:忽略“ UIView”实例上键路径“ checkColor”的用户定义的运行时属性。尝试设置其值时遇到异常:[setValue:forUndefinedKey:]:此类与键checkColor的键值编码兼容。
解决我的问题的方法是为模块提供名称CheckboxButton,如下所示:
注意:您应该将CheckboxButton替换为所使用的模块名称。
| 归档时间: | 
 | 
| 查看次数: | 43186 次 | 
| 最近记录: |