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


157

我有一个非常简单的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将Identity Inspector中的对象的类更改为后PlaceholderTextView,可以Placeholder在Attribute Inspector中将属性设置得很好。该代码在运行应用程序时效果很好,但在界面构建器中不显示占位符文本。我还会收到以下非阻塞错误(我想这就是为什么它在设计时未呈现的原因):

错误:IB设计对象:无法更新自动版式状态:Interface Builder可可触摸工具崩溃

错误:IB设计变量:无法渲染PlaceholderTextView的实例:渲染视图花费的时间超过200毫秒。您的绘图代码可能会降低性能。

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


1
我收到此错误。该对象在测试项目中工作正常,但在我的主项目中(表中)却无法正常工作。根据developer.apple.com/library/mac/recipes/…,我选择了选择编辑器>调试选定的视图。然后,我得到“无法调试视图”“确保您的框架具有用于iOS的正确的构建设置。” Google没有出现此错误。
马特

Answers:


238

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


1
谢谢!这超级有帮助!您在哪里找到有关崩溃报告的信息?:)
Ben-G

57
就我而言,我发现initFrame(frame: CGRect)必须对其进行定义。如果您提供自己的init方法,请这样做。
特拉维斯2015年

这是最好的解决方案。我不是在其中一种视图上实现initWithFrame。
HotFudgeSunday

3
我使用了诊断报告,就像提到的@Travis一样,init(frame: CGRect)由于我有一个自定义ini方法,因此需要显式覆盖该显式报告。您可能希望在崩溃报告中use of unimplemented initializer 'init(frame:)'直接查看Application Specific Information该报告。多谢你们!在这个答案中双赢!
克里斯

4
与往常一样,此日志文件也可在Console macOS应用程序的“ 用户诊断报告”组下找到。
Paulo Mattos'17-4-10

51

我有几次相同的问题。两次都开始于当我无法将IBDesignable笔尖加载到情节提要板上时,笔尖无法适合视图(即,我从UIView离开了一个按钮,但仍在笔尖中)。一旦我修复了Xcode仍然给我的错误,所以我重新启动Xcode,直到它随机停止给我错误。

我希望这有帮助。

更新:我只是杀死了所有名为“ Interface Builder Cocoa Touch Tool”的进程,重新启动了Xcode,错误消失了。不知道这是否将始终有效。


2
虽然我仍然不明白为什么,但是,如果您不覆盖任何init方法,则作为问题一部分发布的代码将不再显示IB Designables错误,并且占位符将在Interface Builder中正确呈现。
Willington Vega 2015年

2
也许这是一个错误,我们只需要等待它被修复即可。也许在Xcode 6.3中。
Youssef Moawad'3

3
XCode 7.1.1并仍然存在。重新启动XCode不能解决问题。我不得不手动终止所有名为Interface Builder Cocoa Touch Tool的进程,然后XCode崩溃,重新启动它,然后它开始工作。
克里斯蒂安·佩纳

1
要点:确实首先杀死了接口构建器进程,然后停止了XCode-如果您这样做,仍然存在解决问题的另一种方法……
TheEye 2015年

2
XCode 8.1仍然会发生此错误。最初是由于没有初始化覆盖而导致,但是在添加初始化之后仍然存在。如描述的那样必须杀死Interface Builder进程,然后按@TheEye所说重新启动xcode
John Fowler

39

就我而言,我正在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];

我以为这也许对某人有帮助。


1
这也解决了我的问题!谢谢@jmoukel!
edopelawi

那解决了我的问题。男子!!!即使我多次研究此解决方案,我也没有注意到“ bundleForClass”这一行。:(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)在Swift
CFR

14

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


完善!这也发现了我的问题-一种错误的字体。这就解释了为什么六个非常相似的IBDesignable中只有一个失败了。
zkarj

13

对于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您正在面对哪个问题?
穆罕默德·扎伊德·帕坦

1
可选处理可防止崩溃。但是您知道什么导致UIImage(named :)始终返回nil吗?
ScottyBlades

注释掉这段代码后,为我解决了这个问题`@objc @available(*,已弃用,重命名:“ backgroundColor”)@IBInspectable公共var signatureBackgroundColor:UIColor = .white {didSet {backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

我在呈现可设计对象时遇到了类似的Interface Builder问题。

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

渲染崩溃

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

没有渲染崩溃

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

你是英雄。
nathangitter

知道为什么图像文字与IB不兼容吗?我遇到过同样的问题。
SwiftsNamesake

6

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

此外,有时是由于Xcode的一个讨厌的错误而发生的。要进行检查,请在情节提要中取消选中“编辑器”>“自动刷新视图”,然后移至另一个文件,清理并重新启动项目。再次输入情节提要后,可以单击编辑器>刷新视图,然后再次选中自动视图。那一次也解决了我的问题。

如果两个都不起作用,则可能是您的IBDesignable视图做错了,因此请在情节提要中选择崩溃的视图,然后单击“编辑器”>“调试视图”进行调试。


你是上帝的恩赐。
andrewcar '18

4

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

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

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

    // custom setup
}

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

    // custom setup
}

您应该始终实现两个init方法。当您从代码初始化视图时,将使用带有框架的初始化,而从InterfaceBuilder中使用带有aDecoder的初始化。
Skodik.o

4

我遇到了同样的问题,并通过添加“ use_frameworks!”解决了该问题。到我项目的Podfile。

希望对您有帮助。


这为我工作时,我曾与JVFloatLabeledTextField这个问题
saswanb

这对我来说是有效的,它采用了一个过时的较旧的Obj-C项目。此后,IB像圣诞树一样照亮!谢谢。
提请..

3

就我而言,这与我使用的迦太基框架有某种联系。我必须在运行路径搜索路径构建设置中添加$(PROJECT_DIR)/ Carthage / Build / iOS


在尝试了所有其他发布的解决方案之后...这是唯一对我有用的修复程序!谢谢!
乔尔(Joel)

3

就我而言,这是OneSignal的问题。显然,他们在2.2.0及更高版本中存在一个错误。切换到2.1.6,一切又变好了!

看看这个


1

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

解决方案1:取消注释#use_frame在pod文件中起作用。

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


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

1

在我的末尾添加此脚本Podfilepod 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


0

我发现原因是您的xib大小与情节提要中的设计大小不同。确保下臂具有相同的高度和宽度。


0

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


0

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


0

就像您从其他开发人员那里获得了代码,并且收到此错误一样。赶紧跑

pod install

这对我有用。希望能帮助到你。


0

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

我总是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
}

-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.