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

Alb*_*ori 157 xcode interface-builder storyboard ios swift

我有一个非常简单的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

错误:IB Designables:无法呈现PlaceholderTextView的实例:渲染视图的时间超过200毫秒.您的绘图代码可能会因性能下降而受损.

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

Pet*_*ter 235

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

  • 在我的例子中,我发现必须定义`initFrame(frame:CGRect)`.如果您提供自己的`init`方法,请这样做. (55认同)
  • 像往常一样,这个日志文件也可以在**用户诊断报告**组下的**Console**macOS应用程序中找到. (4认同)
  • 我使用了诊断报告,就像提到的@Travis一样,我需要明确地覆盖`init(frame:CGRect)`,因为我有一个自定义的`ini`方法.您可能希望在报告中直接查看"应用程序特定信息"下的"使用未实现的初始化程序'init(frame :)'`的崩溃报告.多谢你们!在这个答案中双赢! (3认同)

Dus*_*ams 50

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

我希望这有帮助.

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

  • 我刚刚在Xcode 7.0中看到了这个错误.嘘. (5认同)
  • XCode 7.1.1仍然存在.重新启动XCode并没有解决问题.我不得不手动杀死所有名为Interface Builder Cocoa Touch Tool的进程,然后XCode崩溃,重新启动它并开始工作. (3认同)
  • 虽然我仍然不明白为什么,如果你不覆盖任何'init`方法,作为问题的一部分发布的代码不再显示`IB Designables`错误,并且占位符在Interface Builder中正确呈现. (2认同)
  • 也许这是一个错误,我们只需要等待它修复.也许在Xcode 6.3中. (2认同)
  • XCode 8.1仍然会出现此错误.最初由没有init覆盖引起但在init添加后持久化.必须按照描述杀死Interface Builder进程然后重新启动xcode,如@TheEye所说 (2认同)

jmo*_*kel 39

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

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

看起来我应该使用主捆绑,而是使用类捆绑.所以我替换了以下代码并且它有效:

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

我想也许这可能对某人有所帮助.


Fyo*_*yok 14

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


Zai*_*han 12

对于XCode8 - Swift

添加可选值作为默认值@IBInspectable导致问题.

这不起作用:

@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
      didSet {
       // configureView
      }
}
Run Code Online (Sandbox Code Playgroud)

这应该工作:

@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
    didSet {
        // configureView()
    }
}

class func getDefaultImage() -> UIImage {
    if let defaultImage = UIImage(named: "myImage") {
        return defaultImage
    } else {
        return UIImage()
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

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

使用本答案中建议的技术,我能够追踪到使用图像文字的问题.

渲染崩溃

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")
Run Code Online (Sandbox Code Playgroud)

没有渲染崩溃

self.backgroundImage.image =  UIImage(named: "rectangleCenter")
Run Code Online (Sandbox Code Playgroud)


Yus*_* AK 6

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

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

如果两者都不起作用,那么您可能对IBDesignable视图做了一些错误,因此通过单击编辑器>调试视图选择故事板中的崩溃视图并进行调试