@IBDesignable错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool崩溃

我有一个非常简单的UITextView的子类,它添加了可以在Text Field对象中find的“占位符”function。 这是我的子类的代码:

import UIKit import Foundation @IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate { @IBInspectable var placeholder: String = "" { didSet { setPlaceholderText() } } private let placeholderColor: UIColor = UIColor.lightGrayColor() private var textColorCache: UIColor! override init(frame: CGRect) { super.init(frame: frame) self.delegate = self } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.delegate = self } func textViewDidBeginEditing(textView: UITextView) { if textView.text == placeholder { textView.text = "" textView.textColor = textColorCache } } func textViewDidEndEditing(textView: UITextView) { if textView.text == "" && placeholder != "" { setPlaceholderText() } } func setPlaceholderText() { if placeholder != "" { if textColorCache == nil { textColorCache = self.textColor } self.textColor = placeholderColor self.text = placeholder } } } 

将Identity Inspector中的UITextView对象的类更改为PlaceholderTextView ,我可以在Attribute Inspector中正确设置Placeholder属性。 该代码在运行应用程序时效果很好,但不会在界面构build器中显示占位符文本。 我也得到以下非阻塞错误(我认为这是为什么它不是在devise时渲染):

错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool崩溃

错误:IB Designables:无法渲染PlaceholderTextView的实例:渲染视图需要超过200毫秒。 您的绘图代码可能会受到性能下降的影响

我无法弄清楚是什么导致了这些错误。 第二个错误没有任何意义,因为我甚至不重写drawRect()。 有任何想法吗?

Interface Builder Cocoa Touch Tool崩溃时会生成崩溃报告。 这些位于~/Library/Logs/DiagnosticReports并命名为IBDesignablesAgentCocoaTouch_*.crash 。 在我的情况下,他们包含一个有用的堆栈跟踪,在我的代码中确定问题。

我有几次同样的问题。 这两次,当我将一个IBDesignable笔尖加载到故事板上时,笔尖不能适应视图(即,我有一个UIView的button,但仍然在笔尖)。 一旦我修复xCode仍然给我错误,所以我重新启动Xcode,直到它随机退出给我的错误。

我希望这有帮助。

更新:我刚杀死所有名为“界面生成器cocoa触摸工具”的进程,重新启动Xcode和错误消失。 不知道这是否会一直工作。

在我的情况下,我正在做的下一步在initWithFrame / initWithCoder方法创build视图:

 className = NSStringFromClass([self class]); self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject]; 

看起来我应该使用主包 ,而是类的捆绑。 所以我replace下面的代码,它工作:

 bundle = [NSBundle bundleForClass:[self class]]; className = NSStringFromClass([self class]); self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject]; 

我想也许这可能有助于某人。

对于XCode8 – Swift

@IBInspectable上添加可选值作为默认值,对我造成问题。

这不会工作:

 @IBInspectable var repeatImage:UIImage = UIImage(named:"myImage")!{ didSet{ // configureView } } 

这应该工作:

 @IBInspectable var repeatImage:UIImage = RepeatImageView.getDefaultImage(){ didSet{ // configureView() } } class func getDefaultImage()->UIImage{ if let defaultImage = UIImage(named: "myImage"){ return defaultImage }else{ return UIImage() } } 

您可以在界面生成器中select自定义视图,然后使用EditorDebug Selected Views 。 当所有断点(包括exception断点)都能正常工作时,它将启动所谓的IBDesignableAgentCocoaTouchdebugging会话,您可以准确识别视图崩溃的位置。

就我而言,这是OneSignal的一个问题。 显然,他们在2.2.0及以上版本中有一个错误。 切换到2.1.6,一切都很好!

看看这个 。

在我的情况下,它与我正在使用的迦太基框架有某种关系。 我必须将$(PROJECT_DIR)/ Carthage / Build / iOS添加到运行pathsearchpath构build设置

我有同样的问题,但我通过添加'use_frameworks!'来解决它。 到您的项目的PodFile.hope它可以帮助你。

这个问题并非如此,但也许我会帮助别人。

我有一个类似的问题,当我在@IBDesignable类中,我没有实现两个:

 required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) // custom setup } override init(frame: CGRect) { super.init(frame: frame) // custom setup } 

实际上,如果在故事板的任何视图中都有一些旧的 用户定义属性 (对当前视图无效),这可能会导致代理崩溃。

此外,有时这只是因为Xcode的一个讨厌的bug。 要检查出来,当你在故事板取消选中编辑器>自动刷新视图,然后移动到另一个文件,清理并重新启动您的项目。 再次input故事板后,您可以单击编辑器>刷新视图并再次检查自动的一个。 那一个也解决了我的问题一次。

如果两者都不起作用,那么可能是因为你的IBDesignable视图做了错误的事情,所以在storyboard中select你的崩溃的视图,通过点击Editor> Debug Views

我遇到了类似的Interface Builder问题渲染devise。

使用在这个答案中build议的技术,我能够跟踪这个问题的使用图像文字。

渲染崩溃

 self.backgroundImage.image = #imageLiteral(resourceName: "rectangleCenter") 

没有渲染崩溃

 self.backgroundImage.image = UIImage(named: "rectangleCenter") 

我只是缺less这样的代码platform :ios, '7.0' ,问题解决了。 只要你的pod文件中的这一行,并更新你的pod问题将得到解决。

只要让它在模拟器上生成和运行,如果你在项目的其他地方有错误,只需注释掉它,然后运行designable来更新可devise的并取消注释其他代码。 这个对我有用。

当我debugging这个我发现有一些正在修改用户界面的类。 通常是UILabel的子类或者任何其他类在运行时将UIView和ui进行子类化并与Autolayout引擎冲突的marquelabel。 尝试给这些自定义视图固定宽度或高度。 如果不能解决您的问题,请尝试以下解决scheme: –

解决scheme1: – 在您的pod文件中取消注释#use_frameworks。

解决scheme2: – 尝试删除派生的数据。 1.closuresXcode的编辑器窗口并退出模拟器 – > 2.进入Xcode首选项 – >位置 – > 3.点击显示派生数据path的小灰色箭头 – > 4.select您的项目 – > 5.删除里面的所有文件夹 – > 6.退出Xcode并重新打开

我发现原因是你的xib与storyboard中的devise大小不一样。 确保xib具有相同的高度和宽度。