@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アイデンティティインスペクタでオブジェクトのクラスをに変更した後、属性インスペクタでプロパティをうまくPlaceholderTextView設定できPlaceholderます。アプリを実行するとコードは適切に機能しますが、インターフェイスビルダーにプレースホルダーテキストは表示されません。また、次の非ブロッキングエラーが発生します(これが、デザイン時にレンダリングされない理由です)。

エラー:IB Designables:自動レイアウトステータスの更新に失敗しました:Interface Builder Cocoa Touch Toolがクラッシュしました

エラー:IB Designables:PlaceholderTextViewのインスタンスのレンダリングに失敗しました:ビューのレンダリングに200ミリ秒以上かかりました。描画コードのパフォーマンスが低下する可能性があります。

これらのエラーの原因を特定できません。2番目のエラーは、drawRect()をオーバーライドしていないため、意味がありません。何か案は?


1
このエラーが発生しました。オブジェクトはテストプロジェクトでは正常に機能しましたが、メインプロジェクト(テーブル)では機能しませんでした。developer.apple.com/library/mac/recipes/…によると、[エディターの選択]> [選択したビューのデバッグ]を選択しました。次に、「ビューをデバッグできませんでした」「フレームワークにiOS用のビルド用の正しいビルド設定があることを確認してください。」このエラーのためにGoogleで何も生じませんでした。
Matt

回答:


238

Interface Builder Cocoa Touch Toolがクラッシュしたときに生成されるクラッシュレポートがあります。これらはにあり~/Library/Logs/DiagnosticReports、名前が付けられていIBDesignablesAgentCocoaTouch_*.crashます。私の場合、コードには問題を特定する有用なスタックトレースが含まれていました。


1
ありがとう!これはとても役に立ちました!クラッシュレポートに関する情報はどこで見つけましたか?:)
Ben-G

57
私の場合、それをinitFrame(frame: CGRect)定義する必要があることを発見しました。独自のinitメソッドを提供する場合は、そうしてください。
Travis、

これが最良の解決策でした。私はビューの1つにinitWithFrameを実装していませんでした。
HotFudgeSunday

3
私は診断レポートを使用し、@ Travisが言及したようにinit(frame: CGRect)、カスタムiniメソッドがあったため、明示的にオーバーライドする必要がありました。クラッシュレポートを調べて、レポートのuse of unimplemented initializer 'init(frame:)'直下を探すこともできApplication Specific Informationます。みんなありがとう!この答えでダブル勝ち!
Chris

4
いつものように、このログファイルは、コンソールの macOSアプリの[ユーザー診断レポート]グループにもあります。
Paulo Mattos

51

同じ問題が数回発生しました。どちらの場合も、ニブがビューに収まらなかった(つまり、UIViewのボタンがオフになっているにもかかわらず、ペン先にある)ときに、IBDesignableペン先をストーリーボードにロードしたときに開始されました。Xcodeを修正してもエラーが発生するので、ランダムにエラーが発生しなくなるまでXcodeを再起動しました。

これがお役に立てば幸いです。

更新:「Interface Builder Cocoa Touch Tool」という名前のすべてのプロセスを強制終了し、Xcodeを再起動すると、エラーは発生しなくなりました。これが常に機能するかどうかわからない。


2
理由はまだわかりませんが、initメソッドを上書きしない場合、質問の一部として投稿されたコードにIB Designablesエラーが表示されなくなり、プレースホルダーがインターフェイスビルダーで適切にレンダリングされます。
Willington Vega、

2
おそらくこれはバグであり、修正されるまで待つ必要があります。おそらくXcode 6.3で。
Youssef Moawad、2015年

3
XCode 7.1.1がまだ存在します。XCodeを再起動しても問題は解決しませんでした。Interface Builder Cocoa Touch Toolと呼ばれるすべてのプロセスを手動で強制終了する必要があり、XCodeがクラッシュして再起動し、動作し始めました。
クリスティアンペナ

1
重要なポイント:確かに、最初にインターフェイスビルダープロセスを強制終了してから、XCodeを停止します。問題を回避するために別の方法で実行すると、問題が解決しません...
TheEye

2
XCode 8.1でもこのエラーは発生します。元々はinitオーバーライドがないために発生しましたが、initが追加された後も持続しました。説明されているように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 = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

これは誰かを助けるかもしれないと思った。


1
これで私の問題も修正されました!@jmoukelに感謝!
edopelawi 2017

これで問題が解決しました。おとこ!!!このソリューションを何度か調べても、「bundleForClass」の行に気付かなかった。:(
elk_cloner 2017

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

14

あなたは、Interface Builderを使用し、その後にカスタムビューを選択することができ EditorDebug Selected ViewsIBDesignableAgentCocoaTouchすべてのブレークポイント(例外ブレークポイントを含む)が機能すると、いわゆるデバッグセッションが起動し、ビューがクラッシュした場所を正確に特定できます。


パーフェクト!これも私の問題を見つけました–間違ったフォント。これは、非常に類似した6つのIBDesignablesのうち1つだけが失敗した理由を説明しています。
zkarj 2018年

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どの問題に直面していますか?
Mohammad Zaid Pathan

1
オプションの処理はクラッシュを防ぎます。しかし、UIImage(named :)が一貫してnilを返す原因を知っていますか?
ScottyBlades、2018年

このコードをコメント化することで修正されました `@objc @available(*、deprecated、renamed:" backgroundColor ")@IBInspectable public var signatureBackgroundColor:UIColor = .white {didSet {backgroundColor = signatureBackgroundColor}}`
PhoneyDeveloper

9

Designableのレンダリングで、同様のInterface Builderの問題が発生していました。

この回答で提案された手法を使用して、問題を画像リテラルの使用に追跡することができました。

レンダリングのクラッシュ

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

レンダリングがクラッシュしない

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

あなたはヒーローです。
nathangitter 2017

画像リテラルがIBと互換性がない理由は何ですか?同じ問題がありました。
SwiftsNamesake

6

実際に、ストーリーボードのビューに古い ユーザー定義の属性(現在のビューでは無効)がある場合、エージェントがクラッシュする可能性があります。

また、Xcodeの厄介なバグが原因で発生することもあります。チェックアウトするには、ストーリーボードにいるときに、[エディター]> [ビューを自動的に更新]をオフにしてから、別のファイルに移動し、プロジェクトをクリーンアップして再起動します。ストーリーボードに再度アクセスした後、[エディター]> [ビューの更新]をクリックして、自動ビューを再度確認できます。それも一度私の問題を解決しました。

両方とも機能しない場合は、おそらくIBDesignableビューで何か問題があったので、ストーリーボードでクラッシュしたビューを選択し、[エディター]> [ビューのデバッグ]をクリックしてデバッグします。


あなたは神からの贈り物です。
アンドリューカー2018年

4

これはこの質問には当てはまりませんが、多分私は誰かを助けます。

@IBDesignableクラスで両方を実装しなかった場合も、同様の問題がありました。

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

    // custom setup
}

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

    // custom setup
}

常に両方のinitメソッドを実装する必要があります。Init with frameは、コードからビューを初期化するときに使用され、aDecoderを使用するinitは、InterfaceBuilderから使用されます。
Skodik.o 2018年

4

同じ問題が発生し、「use_frameworks!」を追加することで解決しました。私のプロジェクトのPodfileに。

お役に立てば幸いです。


これは、JVFloatLabeledTextFieldでこの問題が発生したときにうまくいきました
saswanb

これは私にとってはうまくいき、かなり古くなった古いObj-Cプロジェクトを採用しました。この後IBはクリスマスツリーのようにライトアップ!ありがとうございました。
..

3

私の場合、それはどういうわけか私が使用していたカルタゴフレームワークに関連していた。$(PROJECT_DIR)/ Carthage / Build / iOSをRunpath Search Pathsビルド設定に追加する必要がありました


他のすべての投稿された解決策を試した後...これは私にとってうまくいった唯一の修正でした!ありがとう!
Joel

3

私の場合、それはOneSignalの問題でした。どうやら、彼らはバージョン2.2.0以降のバグを持っています。2.1.6に切り替えて、すべてが再び素晴らしいです!

チェックアウトこれを


1

これをデバッグすると、UIを変更しているクラスがいくつかあることがわかりました。通常、UILabelのサブクラスであるmarquelabel、または実行時にUIViewと描画UIをサブクラス化し、Autolayoutエンジンと衝突するその他のクラス。これらのカスタムビューに固定幅または高さを指定してください。それでも問題が解決しない場合は、次の解決策を試してください。

解決策1:ポッドファイル内の#use_frameworksのコメントを外します。

解決策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

このスクリプトをmyの最後に追加して、もう一度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

1

主な問題は、@ IBDesignableを作成するときに、cocoapodファイルがUITestsに含まれていないことを確認してください。そうしないと、このクラッシュが発生します。


0

その理由は、xibがストーリーボードのデザインと同じサイズではないためです。xibの高さと幅が同じであることを確認してください。


0

このコード行が欠けていたため platform :ios, '7.0' 、問題は解決しました。ポッドファイルのこの行だけを更新して、ポッドの問題を更新します。


0

私にとってはアプリを実行したことがないため、署名証明書が欠落していたため、Xcodeはまだ証明書を作成していませんでした。アプリを実行すると、IBDesignableレンダリングは正常に機能しました。


0

他の開発者からコードを入手したときにこのエラーが発生するようなものです。とにかく走れ

pod install

これでうまくいきました。それが役に立てば幸い。


0

直接初期化しUIImageたり、UIFontプロジェクトに追加されたアセットまたはフォントを使用し。

私は常にカスタムクラスprivate func setUp()でを作成します。そこから呼び出されました、。なので、ようやく更新しました。@IBDesignableUIinit(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

プロジェクト内のどこかでエラーが発生した場合は、それをビルドしてシミュレーターで実行できるようにしてください。コメントアウトして、designableを最初に実行して、designableを更新し、他のコードのコメントを外してください。わたしにはできる。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.