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

我有一个非常简单的 UITextView 子类,它添加了“ Placeholder”功能,您可以在 Text Field 对象中找到这种功能。下面是子类的代码:

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

在将身份检查器中的 UITextView对象的类更改为 PlaceholderTextView之后,我可以在属性检查器中很好地设置 Placeholder属性。这段代码在运行应用程序时非常好用,但是在 Interface Builder 中没有显示占位符文本。我还遇到了以下非阻塞性错误(我假设这就是它在设计时不呈现的原因) :

错误: IB 设计: 未能更新自动布局状态: Interface Builder 可可触摸工具崩溃

错误: IB 可设计: 未能呈现 PlaceholderTextView 的实例: 呈现视图所花的时间超过200毫秒。您的绘图代码可能会因性能低下而受到影响。

我无法找出导致这些错误的原因。第二个错误没有任何意义,因为我甚至没有覆盖 draRect ()。有什么想法吗?

83894 次浏览

我也遇到过几次同样的问题。这两次都是在我将一个 IBDesignable 笔尖加载到故事板上的时候,笔尖无法放入视图(即我在 UIView 上有一个按钮,但是仍然在笔尖上)。一旦我修复了 Xcode 仍然给我错误,所以我重新启动 Xcode,直到它随机停止给我错误。

希望这个能帮上忙。

更新: 我刚刚关闭了所有名为“ Interface Builder 可可触摸工具”的进程,重新启动了 Xcode,错误消失了。不知道这是否会一直工作或不。

当 Interface Builder 可可触摸工具崩溃时会产生崩溃报告。这些文件位于 ~/Library/Logs/DiagnosticReports并命名为 IBDesignablesAgentCocoaTouch_*.crash。在我的例子中,它们包含一个有用的堆栈跟踪,可以在我的代码中识别问题。

在我的例子中,我在 initWithFrame/initWithCoder 方法中执行下一步来创建视图:

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

看起来 不是应该使用 主包装,而不是类的 bundle。所以我替换了下面的代码,并且成功了:

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

我想这也许能帮到某人。

我也遇到过同样的问题,我通过在项目的 Podfile 中添加“ use _ Framework!”解决了这个问题。

希望能帮到你。

你可以在 Interface Builder 中选择你的自定义视图,然后使用 EditorDebug Selected Views.当所有断点(包括异常断点)工作时,它将启动所谓的 IBDesignableAgentCocoaTouch调试会话,您可以准确地识别视图崩溃的位置。

在我的案例中,它与我正在使用的迦太基框架有某种联系。我必须将 $(PROJECT _ DIR)/Carthage/Build/iOS 添加到 跑道搜索路径构建设置中

对我来说,这是一个问题与一个信号。显然,他们在2.2.0及以上版本中有一个 bug。切换到2.1.6,一切又恢复正常了!

看看 这个

对于 Xcode 8-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()
}
}

我发现原因是你的单边不是同样的大小作为故事板的设计。确保十字架具有相同的高度和宽度。

我就差这一行代码了 platform :ios, '7.0' 问题就解决了。只需要在您的吊舱文件中的这一行,并更新您的吊舱问题将得到解决。

这个问题的情况并非如此,但也许我会帮助其他人。

当我在@IBDesignable 类中没有同时实现这两个类时,我也遇到了类似的问题:

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)


// custom setup
}


override init(frame: CGRect) {
super.init(frame: frame)


// custom setup
}

只是让它建立和运行在模拟器上,如果你有错误在其他地方的项目只是注释出来,运行可设计的第一更新可设计和取消注释的其他代码。 对我有用。

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

此外,有时这种情况发生仅仅是因为 Xcode 的一个讨厌的 bug。为了检查它,当你在故事板上,取消选中编辑器 > 自动刷新视图,然后移动到另一个文件,清理并重新启动你的项目。再次输入情节串连图板后,您可以点击编辑器 > 刷新视图并再次检查自动视图。那个也曾经解决过我的问题。

如果两者都不能工作,那么您可能对 IBDesignable 视图做了一些错误的事情,所以在情节串连板中选择您崩溃的视图,并通过单击 Editor > Debug 视图进行调试

当我调试这个我发现有一些类正在修改 UI。典型的 marquelabel 是 UILabel 的子类或任何其他类的子类 UIView 和绘图 UI 在运行时与 Autolayout 引擎发生冲突。尝试为这些自定义视图提供固定的宽度或高度。如果它不能解决你的问题,尝试以下解决方案:-

解决方案1:-取消注释 # use _ Framework 在 pod 文件中的位置。

解决方案2:-尝试删除派生数据。1.关闭 Xcode 的 Editor 窗口并退出模拟器-> 2。转到 Xcode Preferences-> Location-> 3。单击显示派生数据路径的灰色小箭头-> 4。选择您的项目-> 5。删除所有文件夹内-> 6。退出 Xcode 并重新打开

我在设计可设计 Interface Builder 时也遇到过类似的问题。

使用这个 回答中建议的技术,我能够追踪到使用图像文字的问题。

渲染崩溃

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

没有渲染崩溃

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

对我来说,这是一个缺失的签名证书,因为我从来没有运行过这个应用程序,所以 Xcode 还没有创建一个证书。一旦我运行这个应用程序,IBDesignable渲染工作得很好。

这就像你从其他开发者那里得到了代码,然后你得到了这个错误。 快跑

pod install

这招对我很管用。 希望能有帮助。

将它添加到您的 Podfile 底部并运行 pod install

# Workaround for Cocoapods issue #7606


post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings.delete('CODE_SIGNING_ALLOWED')
config.build_settings.delete('CODE_SIGNING_REQUIRED')
end
end

Podfile的末尾添加这个脚本,然后再次执行 pod install

post_install do |installer|
installer.pods_project.build_configurations.each do |config|
config.build_settings.delete('CODE_SIGNING_ALLOWED')
config.build_settings.delete('CODE_SIGNING_REQUIRED')
end
end

请确保您没有直接初始化 UIImageUIFont使用资产或字体添加到您的项目。

我总是在我的 @IBDesignable自定义 UI类中创建一个 private func setUp()。 这是从 init(frame: CGRect)init?(coder aDecoder: NSCoder)调用。所以我最后更新了 setup()如下。

private func setUp() {


//... Doing initial configurations


// iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
if let icon = UIImage(named: "IconImageName") {
iconImageView.image = icon
iconImageView.frame.size = icon.size
}


// nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
if let font = UIFont(name: "Calibri-Light", size: size) {
nameLabel.font =  font
} else {
nameLabel.font = UIFont.systemFont(ofSize: size)
}


// Doing other stuffs
}

一个主要的问题是,当您创建@IBDesignable 确保 cocoapod文件时,它不包含在 UITest 中,否则会导致崩溃。

我做了所有的事情,它不工作,直到我重新启动 MAC。尝试重新启动 MAC。为我工作。