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

时间:2014-12-09 08:26:23

标签: ios swift xcode storyboard interface-builder

我有一个非常简单的UITextView子类,它添加了您可以在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
        }
    }
}

将Identity Inspector中的UITextView对象的类更改为PlaceholderTextView后,我可以在Attribute Inspector中设置Placeholder属性。代码在运行应用程序时效果很好,但不会在界面构建器中显示占位符文本。我还得到以下非阻塞错误(我假设这就是它在设计时不呈现的原因):

  

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

     

错误:IB Designables:无法呈现PlaceholderTextView的实例:渲染视图的时间超过200毫秒。您的绘图代码可能会遇到性能下降的问题。

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

22 个答案:

答案 0 :(得分:233)

Interface Builder Cocoa Touch Tool崩溃时会生成崩溃报告。论文位于~/Library/Logs/DiagnosticReports,并命名为IBDesignablesAgentCocoaTouch_*.crash。在我的例子中,它们包含一个有用的堆栈跟踪,用于识别我的代码中的问题。

答案 1 :(得分:50)

我有过几次同样的问题。两次它都是在我将nib不能放在视图上时将IBDesignable笔尖加载到故事板上时开始的(即我有一个关闭UIView的按钮但仍然在笔尖中)。一旦我修复了xCode仍然给我错误,所以我重新启动Xcode,直到它随机退出给我错误。

我希望这会有所帮助。

更新:我刚刚杀死了名为“Interface Builder Cocoa Touch Tool”的所有进程,重新启动了Xcode并且错误消失了。不知道这是否会一直有效。

答案 2 :(得分:39)

就我而言,我在initWithFrame / initWithCoder方法中执行下一步创建视图:

ASK {
   SELECT (count(?student) AS ?stcount) (count(?section) AS ?secount) (count(?course) AS ?ccount)
   WHERE {
      ?indiv :hasStudent ?student .
      ?indiv :hasSection ?section .
      ?indiv :grade_course ?course .
   } GROUP BY ?student ?section ?course
   HAVING (stcount = 1 && ?secount = 1 && ?ccount = 1)
}

看起来我 应该使用主要包,而是使用类的捆绑包。所以我替换了以下代码,它起作用了:

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

我想也许这对某些人有帮助。

答案 3 :(得分:14)

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

答案 4 :(得分:11)

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

答案 5 :(得分:9)

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

使用此answer中建议的技术,我能够找到使用图像文字的问题。

渲染崩溃

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

无渲染崩溃

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

答案 6 :(得分:6)

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

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

如果两者都不起作用,那么您的IBDesignable视图可能已经做错了,所以选择故事板中的崩溃视图并通过单击编辑器>进行调试。调试视图

答案 7 :(得分:4)

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

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

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

    // custom setup
}

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

    // custom setup
}

答案 8 :(得分:3)

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

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

查看this

答案 11 :(得分:1)

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

答案 12 :(得分:1)

当我调试这个时,我发现有一些类正在修改UI。通常marquelabel是UILabel的子类或任何其他类的子类UIView并在运行时绘制ui并与Autolayout引擎冲突。尝试为这些自定义视图指定固定宽度或高度。如果它没有解决您的问题,请尝试以下解决方案: -

解决方案1: - 在pod文件中取消注释#use_frameworks。

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

答案 13 :(得分:1)

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

答案 14 :(得分:1)

将其添加到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

答案 15 :(得分:0)

我做了一切,直到重新启动MAC后它才起作用。尝试重新启动MAC。为我工作。

答案 16 :(得分:0)

请确保您没有使用项目中添加的资源或字体直接初始化 UIImage UIFont

我总是在我的private func setUp()自定义@IBDesignable类中创建一个UI。 从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
}

答案 17 :(得分:0)

如果您从其他开发人员那里获得了代码并且您收到此错误,那就好了。 跑吧

pod install

这对我有用。 希望它有所帮助。

答案 18 :(得分:0)

对我而言,这是一张缺少的签名证书,因为我从未运行该应用程序,因此Xcode尚未创建证书。运行应用程序后,IBDesignable渲染工作正常。

答案 19 :(得分:0)

我只是错过了这行代码    platform :ios, '7.0' 问题解决了。您的pod文件中的这一行和更新您的pod问题将得到解决。

答案 20 :(得分:0)

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

答案 21 :(得分:-1)

让它在模拟器上构建并运行如果你在项目的其他地方有错误只是注释掉它并首先运行可设计更新可设计并取消注释其他代码。 这个对我有用。