@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 中选择您的自定义视图,然后使用 EditorDebug 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】:

确保您没有使用项目中添加的资产或字体直接初始化 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

【讨论】:

【参考方案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 中加载图像

将@IBDesignable 用于渐变视图

Sse IBInspectable 和 IB_DESIGNABLE 错误更改未显示在情节提要中?

IBDesignable UIButton 子类