@IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃
Posted
技术标签:
【中文标题】@IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃【英文标题】:@IBDesignable error: IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed 【发布时间】:2015-02-07 01:44:51 【问题描述】:我有一个非常简单的 UITextView 子类,它添加了“占位符”功能,您可以在文本字段对象中找到该功能。这是我的子类代码:
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
属性就好了。该代码在运行应用程序时运行良好,但不会在界面构建器中显示占位符文本。我还收到以下非阻塞错误(我认为这就是它在设计时不呈现的原因):
错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃
错误:IB Designables:无法渲染 PlaceholderTextView 的实例:渲染视图耗时超过 200 毫秒。您的绘图代码可能会遇到性能缓慢的问题。
我无法弄清楚导致这些错误的原因。第二个错误没有任何意义,因为我什至没有覆盖 drawRect()。有什么想法吗?
【问题讨论】:
我收到了这个错误。该对象在测试项目中运行良好,但在我的主项目中(在表格中)却不行。根据developer.apple.com/library/mac/recipes/…,我选择了Choose Editor > Debug Selected Views。然后我得到“无法调试视图”“确保您的框架具有为 ios 构建的正确构建设置。” Google 中没有出现此错误。 【参考方案1】:Interface Builder Cocoa Touch Tool 崩溃时会生成崩溃报告。论文位于~/Library/Logs/DiagnosticReports
并命名为IBDesignablesAgentCocoaTouch_*.crash
。在我的例子中,它们包含一个有用的堆栈跟踪,可以识别我的代码中的问题。
【讨论】:
谢谢!这非常有帮助!您在哪里找到有关崩溃报告的信息? :) 就我而言,我发现必须定义initFrame(frame: CGRect)
。如果您提供自己的 init
方法,请这样做。
这是最好的解决方案。我没有在其中一个视图上实现 initWithFrame。
我使用了诊断报告,就像@Travis 提到的那样,我需要明确覆盖init(frame: CGRect)
,因为我有一个自定义的ini
方法。您可能希望直接在报告中的Application Specific Information
下查看use of unimplemented initializer 'init(frame:)'
的崩溃报告。多谢你们!在这个答案中双赢!
像往常一样,此日志文件也可以在 Console macOS 应用程序的 User Diagnostic Reports 组下找到。【参考方案2】:
我遇到过同样的问题几次。两次都是在我将 IBDesignable 笔尖加载到情节提要时开始的,当时笔尖无法适应视图(即,我在 UIView 上有一个按钮,但仍在笔尖中)。一旦我修复了 Xcode 仍然给我错误,所以我重新启动了 Xcode,直到它随机停止给我错误。
我希望这会有所帮助。
更新:我刚刚杀死了所有名为“Interface Builder Cocoa Touch Tool”的进程,重新启动了 Xcode,错误就消失了。不知道这是否会一直有效。
【讨论】:
虽然我仍然不明白为什么,如果您不覆盖任何init
方法,作为问题的一部分发布的代码将不再显示 IB Designables
错误和占位符在 Interface Builder 中正确呈现。
也许这是一个错误,我们只需要等待它被修复。也许在 Xcode 6.3 中。
XCode 7.1.1 并且仍然存在。重新启动 XCode 并没有解决问题。我不得不手动杀死所有名为 Interface Builder Cocoa Touch Tool 的进程,然后 XCode 崩溃,重新启动它并开始工作。
重要的一点:确实首先杀死界面生成器进程,然后停止 XCode - 如果你以其他方式解决问题仍然存在......
XCode 8.1 这个错误仍然出现。最初是由于没有初始化覆盖但在添加初始化后仍然存在。必须按照描述杀死 Interface Builder 进程然后按照@TheEye 说的那样重新启动 xcode【参考方案3】:
在我的例子中,我在 initWithFrame/initWithCoder 方法中执行下一步来创建视图:
className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
看起来我应该不使用Main Bundle,而是使用类的bundle。所以我用下面的代码替换了它,它起作用了:
bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];
我想也许这可能会对某人有所帮助。
【讨论】:
这也解决了我的问题!谢谢@jmoukel! 那个解决了我的问题。人!!!即使我多次查看此解决方案,我也没有注意到“bundleForClass”行。 :(let bundle = Bundle(for: ValidatingTextField.self)
在 Swift 中【参考方案4】:
您可以在 Interface Builder 中选择您的自定义视图,然后使用
Editor
,Debug Selected Views
。当所有断点(包括异常断点)工作时,它将启动所谓的IBDesignableAgentCocoaTouch
调试会话,并且您可以准确识别视图崩溃的位置。
【讨论】:
完美!这也发现了我的问题——字体不正确。这就解释了为什么六个非常相似的 IBDesignables 中只有一个失败了。【参考方案5】:对于 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()
【讨论】:
@DungTran 您面临哪个问题? 可选处理可防止崩溃。但是你知道是什么导致 UIImage(named:) 始终返回 nil 吗? 注释掉这段代码为我修复了它` @objc @available(*, deprecated,renamed: "backgroundColor") @IBInspectable public var signatureBackgroundColor: UIColor = .white didSet backgroundColor = signatureBackgroundColor `【参考方案6】:我在渲染设计对象时遇到了类似的 Interface Builder 问题。
使用answer 中建议的技术,我能够追踪到使用图像文字的问题。
渲染崩溃
self.backgroundImage.image = #imageLiteral(resourceName: "rectangleCenter")
没有渲染崩溃
self.backgroundImage.image = UIImage(named: "rectangleCenter")
【讨论】:
你是英雄。 知道为什么图像文字与 IB 不兼容吗?我有同样的问题。【参考方案7】:实际上,如果您在情节提要的任何视图中都有一些旧 用户定义的属性(对当前视图无效),这可能会导致您的代理崩溃。
此外,有时它只是因为 Xcode 的一个讨厌的错误而发生。要检查它,当您在情节提要时取消选中编辑器 > 自动刷新视图,然后移动到另一个文件,清理并重新启动您的项目。再次进入 storyboard 后,可以点击 Editor > Refresh Views 并再次勾选 Automatic one。那个也解决了我一次的问题。
如果两者都不起作用,那么可能是您对 IBDesignable 视图做错了,因此请在情节提要中选择崩溃的视图并通过单击编辑器 > 调试视图进行调试
【讨论】:
你是上帝的礼物。【参考方案8】:这个问题不是这样,但也许我会帮助别人。
在我的@IBDesignable 类中我没有同时实现这两个时,我遇到了类似的问题:
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
// custom setup
override init(frame: CGRect)
super.init(frame: frame)
// custom setup
【讨论】:
您应该始终实现这两种初始化方法。当您从代码初始化视图时使用带有框架的初始化,而从 InterfaceBuilder 使用带有解码器的初始化。【参考方案9】:我遇到了同样的问题,我通过添加“use_frameworks!”解决了这个问题!到我项目的 Podfile。
希望对你有帮助。
【讨论】:
当我遇到 JVFloatLabeledTextField 问题时,这对我有用 这对我有用,采用了一个相当过时的旧 Obj-C 项目。在此之后,IB 就像一棵圣诞树一样亮起来!谢谢。【参考方案10】:就我而言,这是 OneSignal 的问题。显然,他们在 2.2.0 及更高版本中有一个错误。切换到 2.1.6,一切又好起来了!
查看this。
【讨论】:
【参考方案11】:在我的情况下,它与我正在使用的迦太基框架有关。我必须将 $(PROJECT_DIR)/Carthage/Build/iOS 添加到 Runpath Search Paths 构建设置
【讨论】:
在尝试了所有其他已发布的解决方案之后......这是唯一对我有用的解决方案!谢谢!【参考方案12】:当我调试这个时,我发现有一些类正在修改 UI。通常 marquelabel 是 UILabel 的子类或任何其他子类 UIView 和在运行时绘制 ui 并与 Autolayout 引擎发生冲突的类。尝试为这些自定义视图提供固定的宽度或高度。如果它不能解决您的问题,请尝试以下解决方案:-
解决方案 1:- 在 pod 文件中取消注释 #use_frameworks。
解决方案 2:- 尝试删除派生数据。 1. 关闭 Xcode 的编辑器窗口并退出模拟器 -> 2. 转到 Xcode Preferences -> Locations -> 3. 单击显示派生数据路径的灰色小箭头 -> 4. 选择您的项目 -> 5. 删除里面的所有文件夹-> 6. 退出 Xcode 并重新打开
【讨论】:
【参考方案13】:将其添加到 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
【讨论】:
【参考方案14】:将此脚本添加到我的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
【讨论】:
【参考方案15】:一个主要问题是,当您创建 @IBDesignable 时,请确保 cocoapod 文件未包含在 UITests 中,否则会导致此崩溃。
【讨论】:
【参考方案16】:我发现原因是您的 xib 与故事板中的设计大小不同。确保 xib 具有相同的高度和宽度。
【讨论】:
【参考方案17】:我只是错过了这行代码
platform :ios, '7.0'
问题就解决了。只需在您的 pod 文件中添加这一行并更新您的 pod 问题即可解决。
【讨论】:
【参考方案18】:对我来说,这是缺少签名证书,因为我从未运行过该应用程序,因此 Xcode 尚未创建证书。运行应用程序后,IBDesignable
渲染工作正常。
【讨论】:
【参考方案19】:这就像如果您从其他开发人员那里获得代码并且您收到此错误。 跑吧
pod install
这对我有用。 希望对您有所帮助。
【讨论】:
【参考方案20】:确保您没有使用项目中添加的资产或字体直接初始化 UIImage
或 UIFont
。
我总是在我的@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
【讨论】:
【参考方案21】:我做了所有的事情,直到我重新启动 MAC 才起作用。尝试重新启动 MAC。为我工作。
【讨论】:
【参考方案22】:如果您在项目的其他地方有错误,只需让它在模拟器上构建和运行,只需将其注释掉并首先运行 designable 以更新 designable 并取消注释其他代码。 这个对我有用。
【讨论】:
以上是关于@IBDesignable 错误:IB Designables:无法更新自动布局状态:Interface Builder Cocoa Touch Tool 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
@IBDesignable UiView draw(_ rect: CGRect) 在 IB 中有效,但在设备上无效
Xcode - IB Designable:无法渲染和更新自动布局(找不到合适的图像)
如何使用 IBDesignable UIImageView 在 prepareForInterfaceBuilder 中加载图像