IB_DESIGNABLE,IBInspectable - 接口构建器不更新

时间:2014-10-31 11:53:02

标签: ios interface-builder ibdesignable 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

enter image description here

这增加了&#34; Designables&#34;行。它停留在&#34;更新&#34;并且工具提示说&#34;等待目标建立&#34;。它永远不会改变这种状态。

当我转到属性inspect时,我可以设置这些IBInspectable属性:

enter image description here

一旦设置,它们也会显示在&#34;用户定义的运行时属性&#34;:

enter image description here

然而,&#34; Designables&#34;状态永远不会超越&#34;更新&#34;仍然使用相同的工具提示(我已经多次尝试过Cmd + B构建,没有任何变化)。

此外,当我设置IBInspectable属性时,我会收到每个属性的警告:

  

IBDesignables - 忽略关键路径的用户定义的运行时属性&#34; borderColor&#34;关于&#34; UIView&#34;的实例...此类不是键值borderColor兼容的键值编码。

生成警告的屏幕截图:

enter image description here


我熟悉符合键值编码的问题,并且通常知道如何解决它们......但我不明白如何在这里解决这个问题。根据视图的身份检查员,该视图是一个&#34; CustomView&#34; (不是常规&#34; UIView&#34;,它没有这些属性)。如果视图不是&#34; CustomView&#34;然后这些可设计的属性不会出现在属性检查器中,对吗?但是当Interface Builder尝试将这些属性应用于视图时,它又回过头来认为视图的类是&#34; UIView&#34;并且不能应用属性。

有任何帮助吗?如果我遗漏了一些重要的细节,请告诉我,但是为了它的价值,I followed this tutorial exactly(除了ObjC vs Swift之外)。同样值得注意的是,我在另一台机器上完全按照本教程进行操作,它就像一个魅力(我打算昨晚发布这个帖子,但我当时的电脑没有这个问题)。 / p>


根据评论,有人建议可能不包含.m文件,这可能会导致问题。我当然认为我可能已经不再为这种情况做好准备,但我还是检查了。

enter image description here

当我第一次尝试这样做时,我理解为IB_DESIGNABLE类必须是不同UIKit框架的一部分。因此,从第一个屏幕截图中,您可以看到我设置了一个&#34; CustomViews&#34;框架,有一个类CustomView。您还会在此处看到我还创建了OtherView,它与CustomView相同,但它不在单独的框架中。但是,两个类之间的故事板上仍然存在相同的问题。

我们在此处有一个屏幕截图,指出CustomView.m包含在CustomViews框架中构建:

enter image description here

同时,以下屏幕截图显示了几件事:

  • CustomViews.framework适当地包含在主项目中。
  • OtherView.m也作为编译源包含在内,因此即使CustomView出现问题,OtherView也应该有效,但它会产生相同的错误。
  • Main.storyboardLaunchScreen.xib显示为红色。我不知道为什么,并且对于为什么LaunchScreen.xib应该(我还没有触及过这个文件)有丝毫的线索,虽然我可以在看完其他项目之后说{{1}这些项目也显示为红色,我在Main.storyboardIB_DESIGNABLE没有做任何事情。

enter image description here


我已经尝试过多次并且已经重试了几次。它每次都在家里的电脑上工作 - 我不能在家里重现这个问题中描述的问题。在工作中,它永远不会奏效。这个问题中描述的问题每次都会发生。

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

其他人向我建议可能是RAM不好。这对我来说似乎遥不可及。我多次重启项目,多次重启计算机。对我来说,如果大约6个月大的计算机上存在坏RAM,我会看到其他问题,而且这个问题会不那么一致。但是,尽管多次从头开始重新启动整个项目并在计算机上完全重新启动,但这个确切的问题仍然存在。


值得注意的是,如果我实际编译并运行此项目,则实际显示具有IBInspectable属性的自定义视图,因为我希望故事板能够显示它。我想,即使没有IBInspectableIB_DESIGNABLE指令也会出现这种情况,因为这些指令是作为用户定义的运行时属性创建的。

11 个答案:

答案 0 :(得分:73)

基于chrisco建议调试所选视图(我已经完成了,但又去尝试了一下),我注意到编辑菜单底部还有其他一些选项。

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

我点击了#34;刷新所有视图&#34;在Xcode有点思考之后,故事板突然显示了我的预期视图(正确应用我的IBInspectable属性)。

enter image description here

然后我再次完成整个过程以确认这是解决方案。

我创建了一个新类ThirdView。这个类再次与其他类完全相同。我将观点的课程改为ThirdView并且这次略有不同:

enter image description here

点击&#34;显示&#34;给我警告:

enter image description here

这次是新的:

  

将类UIView用于具有自定义类的对象,因为类ThirdView不存在。

这并不比现有的更有帮助。此外,现在其他三个警告已经奇怪地翻了六倍。

无论如何,如果我点击&#34;刷新所有视图&#34;再次从编辑器下拉菜单中,所有错误消失,再次正确显示视图。

到目前为止,我所做的一切都是我在家里从未搞砸过的东西。在家里,它只是工作。所以我打开了#34;自动刷新视图&#34;并创建了一个&#34; FourthView&#34;测试 - 再次,与前三个相同。

将视图的类更改为&#34; FourthView&#34; designables标签说&#34;更新&#34;在短时间内,最后说了#34;最新&#34;:

enter image description here

所以,我在家检查了我的电脑。 &#34;自动刷新视图&#34;在一直工作的计算机上打开。它在没有的电脑上被关闭了。我永远不记得触摸这个菜单选项了。我甚至无法告诉你它是否在Xcode 6之前存在。但是这个选项正在产生差异。


TL; DR,如果您遇到问题中描述的相同问题,请确保&#34;自动刷新视图&#34;已打开(或手动&#34;刷新所有视图&#34;当您需要在IB中更新时):

enter image description here

答案 1 :(得分:22)

快速提示其他有此问题的人:请记住指定变量的类型。

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true

答案 2 :(得分:20)

我还有一些细节可能会导致您的IBDesignable类无法加载。

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

在导航器区域中,前往XCode工作区/项目中的报告导航器。

在XCode的Editor菜单中,点击(如nhgrif所述),&#34;刷新所有视图&#34;选项。这将导致IB针对您确定不会发现的一大堆内容启动编译。

在报告导航器中,单击&#34;按组&#34;过滤内容并查看&#34; Interface Builder&#34;部分。您将看到,为了加载自定义IBDesignable视图框架,它将编译很多东西。如果这些目标中的任何不编译,例如(可能已弃用)单元测试目标(即使它们与加载这些视图或故事板的代码完全无关),那么IB将无法加载您的DLL。

在我的案例中,IB试图编译8个目标,其中4个是自我们最近的重构改变以来尚未更新的单元测试,我们一直在努力。

我为了让IB正确加载和显示我的海关视图而没有相关甚至链接到这些类的大部分代码更改/修复,也不会在运行这些单元测试的过程中加载故事板。然而,IB依赖于整个工作空间来编译它的工作。

答案 3 :(得分:6)

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

原来,在我的情况下,它与Xcode缓存有关。

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

清除DerivedData并且警告消失。

答案 4 :(得分:5)

任何其他人遇到错误IB Designables类不存在,原因和我一样。最佳答案不是我的问题......但这是一个稍微相关的问题......

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

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

因此,某些观点的XML最终结果为 customClass =&#34; ForwardArrow&#34; customModule =&#34; MainTargetNameWasHere&#34;

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

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

我的来源示例:

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

答案 5 :(得分:5)

作为我的例子,我正在使用CheckboxButton通过pod并且复选框的图形从未显示在故事板中,而我在此处遇到问题中描述的相同问题:

  

警告:IB Designables:将类UIView用于具有自定义类的对象,因为类CheckboxButton不存在

  

警告:IB Designables:在“UIView”实例上忽略关键路径“checkColor”的用户定义的运行时属性。尝试设置其值时遇到异常:[setValue:forUndefinedKey:]:此类不是键值checkColor的键值编码。

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

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

答案 6 :(得分:4)

我个人通过使用&#34; - &#34;解决了这个问题。按钮从我的身份检查器中删除内容。当您删除自定义类,更改IB中的内容,然后添加新的自定义类时,身份检查器中的可设计元素不会被删除,这会导致我出现该错误。只需删除所有内容并重建即可。 enter image description here

答案 7 :(得分:1)

我知道这已经得到了解答,但这是另一种体验。

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

在修复组件的(代码)问题后,我刷了很多次,但身份检查器中仍然没有属性。

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

答案 8 :(得分:1)

上面的

Dave Thomas's answer给了我(反向)解决方案,而不是其他的(衍生数据,编辑器&gt;刷新),但为了清楚起见,人们不知道在哪里编辑XML ......你不需要!

  1. 在故事板文件中选择麻烦的视图
  2. 在右侧边栏上选择Identity Inspector选项卡(左起第3个选项)。
  3. 您将拥有应该已经设置的自定义类和Module。对我来说,这是空的,我得到的错误与OP相同。我将Module设置为项目名称和BAM - 它在重建后开始工作!

答案 9 :(得分:0)

我刚刚解决了这个问题。我尝试了这里和其他地方列出的所有东西,没有任何运气。这是一个永远运作良好的故事板,它突然停止使用&#34;忽略用户定义的运行时属性......&#34;问题

无论出于何种原因,从我的一个IBDesignable中删除此代码修复了它:

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

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

答案 10 :(得分:0)

我遇到了同样的问题,我不得不将cornerRadius和BorderWidth更改为String,然后将其转换为CGFloat,这是我能够更改值并在界面构建器中查看更改的唯一解决方案

@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
    }
}