@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自定义视图,然后使用Editor
, Debug Selected Views
。 当所有断点(包括exception断点)都能正常工作时,它将启动所谓的IBDesignableAgentCocoaTouch
debugging会话,您可以准确识别视图崩溃的位置。
就我而言,这是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具有相同的高度和宽度。