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


91

我有以下代码集:

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”行。它停留在“更新”上,工具提示显示“正在等待目标建立”。从此状态永远不会改变。

当我转到属性检查时,我可以设置以下IBInspectable属性:

在此处输入图片说明

设置后,它们还将显示在“用户定义的运行时属性”中:

在此处输入图片说明

但是,“ Designables”状态永远不会超出具有相同工具提示的“更新”状态(我已经尝试过Cmd + B构建多次,没有任何变化)。

此外,在设置IBInspectable属性时,我会为每个警告:

IBDesignables-忽略“ UIView”实例上键路径“ borderColor”的用户定义的运行时属性...此类与键borderColor的键值编码不兼容。

生成的警告的屏幕截图:

在此处输入图片说明


我熟悉与键值编码兼容的问题,并且通常知道如何解决这些问题...但是在这里我不了解如何解决此问题。根据视图的身份检查器,该视图是“ CustomView”(不是常规的“ UIView”,它不具有这些属性)。而且,如果视图不是“ CustomView”,那么这些可设计的属性将不会显示在“属性”检查器中,对吗?但是,当Interface Builder尝试将这些属性应用于视图时,可以回过头来以为视图的类是“ UIView”,并且无法应用这些属性。

有什么帮助吗?如果我遗漏了一些重要的细节,请让我知道,但是对于它的价值,我完全遵循了本教程(ObjC和Swift除外)。还值得注意的是,我完全在另一台计算机上遵循了本教程,并且它的工作原理像一个魅力(我打算昨晚发表这篇文章,但是当时我所在的计算机没有这个问题)。


根据评论,建议该.m文件可能不包含在内,这可能是导致问题的原因。我认为对于这种情况我肯定会尽力而为,但是无论如何我还是检查了一下。

在此处输入图片说明

当我第一次尝试这样做时,我的理解是这些IB_DESIGNABLE类必须是不同UIKit框架的一部分。因此,从第一个屏幕截图中,您可以看到我建立了一个“ CustomViews”框架,该框架有一个类CustomView。您还将在这里看到我还创建了一个OtherViewCustomView,与相同,只是它不在单独的框架中。但是,两个班级之间的情节提要上仍然存在相同的问题。

在这里,我们有一个屏幕快照,指示CustomView.mCustomViews框架将包含该屏幕快照:

在此处输入图片说明

同时,以下屏幕截图表明了几件事:

  • CustomViews.framework 已适当地包含在主项目中。
  • OtherView.m也包含在内作为编译源,因此即使出现问题CustomView,也OtherView应该可以工作,但是会产生相同的错误。
  • Main.storyboardLaunchScreen.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_DESIGNABLEand IBInspectable指令,情况也会如此,因为它们是作为用户定义的运行时属性创建的。


好吧,这只是一个主意。我从目标中删除了CustomView.m,然后在运行该应用程序时收到了类似的警告。
马丁R

如果将您与看似相同的机器(有所不同)进行比较,那看起来就像是一颗真正的鬼怪。您是否尝试过发布到devforums?似乎您在没有其他信息的情况下视而不见,并且您的流程似乎是合理的。由于Xcode充斥着误导性的错误消息,因此“ build”警告可能并不意味着太多。但是,对于踢,您尝试了Editor->“ debug selected view”,对吗?(可能不起作用,但值得进行健全性检查)。另外,(记录)控制台应用程序中是否显示任何内容?
克里斯·康诺弗

有同样的问题。使用包含IB_DESIGNABLE的单个xib文件进行挖掘。但是检查我的设置后,我已经启用了自动刷新功能,现在我尝试了手动刷新,先清除派生数据等。到目前为止,没有任何事情起作用。奇怪的是我让此控件正常工作,然后停止了。而且我认为我之间没有更改任何代码。疯。
drekka

正在显示上述警告。现在已经创建了第二个类,其中包含了从原始IB可复制的代码。这堂课非常好,当我切换回原来的不上课时,现在可以正常工作了。由此得出的结论是,直到原始ib designable交换为另一个ib designable之前,某些地方(不在派生数据中)有一些缓存才被清除。更改为UIView似乎无法清除此缓存。只有另一个ib可设计。去图:-)
drekka

Answers:


75

根据chrisco的建议,调试选定的视图(我已经做过,但是为了更好地尝试再试一次),我注意到Editor菜单底部的其他几个选项。

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

我单击“刷新所有视图”,在Xcode考虑了一下之后,情节提要板突然按预期显示了我的视图(正确应用了我的IBInspectable属性)。

在此处输入图片说明

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

我创建了一个新类,ThirdView。此类又一次与其他类相同。我将视图的类更改为ThirdView,这次有所不同:

在此处输入图片说明

单击“显示”给我看警告:

在此处输入图片说明

这次有一个新的:

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

这实际上并没有比已经存在的有用。另外,现在其他三个警告奇怪地翻了一番,变成了六个。

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

到目前为止,我所做的一切都是我从未在家里弄过的东西。在家里,它只是工作。因此,我打开了“自动刷新视图”并创建了一个“ FourthView”进行测试-再次,与前三个相同。

将视图的类更改为“ FourthView”后,designables标签会短暂显示“正在更新”,然后最终会显示“最新”:

在此处输入图片说明

因此,我在家检查了我的计算机。在始终正常工作的计算机上打开了“自动刷新视图”。在没有的计算机上将其关闭。我永远都不记得触摸此菜单选项。我什至无法肯定地告诉您它是否存在于Xcode 6之前。但是,这种选择才有所作为。


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

在此处输入图片说明


2
我实际上是在寻找如何关闭它的方法,因为它会一直在后台渲染,从而使较旧的MacBook真的很慢。谢谢!
Departamento B

这可能会解决临时问题,但请查看@ Martin-Gilles Lavoie的答案
Ashley Mills,

22

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

选择您有问题的情节提要/ xib,您应该在其中显示自定义视图。

在导航器区域中,转到XCode工作区/项目中的“报表导航器”。

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

在报表浏览器中,单击“按组”以过滤内容,然后查看“接口生成器”部分。您将看到,为了加载自定义IBDesignable视图框架,它将编译很多东西。如果没有编译任何这些目标,例如(也许已弃用)单元测试目标(即使它们与加载这些视图或情节提要的代码完全无关),那么IB将无法加载您的dll。

以我为例,IB试图编译8个目标,其中4个目标是自从我们最近进行重构以来就没有更新的单元测试。

我所做的大多数代码更改/修复都是为了使IB正确加载和显示与这些类无关甚至不相关的海关视图,也不会在运行这些单元测试的过程中加载情节提要。但是,IB依赖于整个工作区进行编译才能正常工作。


嘿,那么我如何阻止IB尝试加载和显示与这些类无关或未链接的视图?
HannahCarney 2015年

我假设它与标头依赖项有关。如果可设计类与其他类接触,那么一旦看到标头,它就会构建那些相关的实现。Apple正在使用XC7GM中的源代码依赖图代码,该代码在我们的项目中完全失败,并且在构建图时XCode崩溃。以下7.1betas不会出现此问题。目前,我们的自动化构建系统仍依赖于6.4,因此我们尚未研究如何在XC6.4下进一步解决此问题。我们将直接跳到7.1GM。
Martin-Gilles Lavoie

如果您有多个目标/项目,那么这绝对是正确的答案,并且确实可以解决问题-所有目标都必须完全构建,我什至不知道报告导航器中有“ Interface Builder”部分!我见过的所有其他答案基本上都是挥手致意的,这可能会暂时修复它,但这是最终的解决方案。做得好。
Ashley Mills

3
因此,据此可以得出结论,IB_DESIGNABLE属性是浪费时间和浪费时间。只是避免使用它。
m8labs

IB_DESIGNABLE与上面列出的问题和解决方案无关。它只是IB识别可用事物的NO-OP标志。您只需要维护一个干净的房子。
Martin-Gilles Lavoie

22

对于任何其他有此问题的人,这只是一个快速提示:记住指定变量的类型。

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

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

6

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

事实证明,就我而言,这与Xcode缓存有关。

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

清除后DerivedData,警告消失了。


1
⌘⇧K:快捷XCode中实现同样的结果
Mojo66

@ Mojo66我相信Clean Build与清除DerivedData文件夹不同。当然,有时干净的构建足以解决某些Xcode缓存问题。
samwize 2015年

@ Mojo66您可能是说⌘⌥⇧K(cmd + alt + shift + K)
tzaloga

5

如果由于与我相同的原因,没有其他人遇到错误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">

1
天哪,这让我发疯了一天。真是个讨厌的小虫子。
GoldenJoe '16

5

作为我的示例,我通过吊舱使用CheckboxButton,并且在出现以下问题中所述的相同问题时,故事板中也不会显示checkbox的图形:

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

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

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

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


4

我个人通过使用“-”按钮从身份检查器中删除内容来解决了此问题。当您删除自定义类时,更改IB中的内容,然后添加一个新的自定义类,身份检查器中的可设计元素不会被删除,这会导致我遇到该错误。只需删除所有内容并重建即可。在此处输入图片说明


我完全按照你说的做,就解决了我的问题。此处公开的所有先前解决方案均未实现。非常感谢。; o)
XLE_22'Sep 25'16

@ XLE_22有时候是没人解决的答案,是吗?:)
HannahCarney

我有一个问题,在一些xib上重命名了IBInspectable属性。完成此操作后,我收到大量警告,通知我XCode找不到现在重命名的属性。从身份检查器中删除财产解决了我的问题。
WBuck

1

我知道已经回答了,但是这里还有另一种经验。

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

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

最终,我注意到它们返回了,但仅在属性检查器(alt-apple-4)中。我在那里添加值后,它们立即重新出现在身份检查器中


1

Dave Thomas的上述回答为我提供了(反向)解决方案,而其他解决方案(“派生数据”,“编辑器”>“刷新”)却没有,但是为了清楚起见,以防人们不确定在哪里编辑XML ...您不这样做。不需要!

  1. 在情节提要文件中选择麻烦的视图
  2. 在右侧边栏上,选择“身份检查器”选项卡(左侧第3个选项)。
  3. 您将拥有应该已设置的自定义类,以及Module。对我来说,这是空的,我得到的错误与OP相同。我将设置Module为我的项目名称和BAM-重建后它开始工作!

0

我只是在这个问题上经历过。我没有任何运气就尝试了这里和其他地方列出的所有东西。这是一个故事板,可以一直运行良好,并且突然停止处理“忽略用户定义的运行时属性...”问题。

无论出于何种原因,请从我的IBDesignable的其中之一中除去以下代码:

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

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


3
您在这里错过晚饭的电话
RolandasR

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

我认为IBInspectable仅能执行某些类型,所以也许您需要使用Float代替CGFloat并将其
强制转换
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.