web-dev-qa-db-ja.com

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

私はあなたがText Fieldオブジェクトにネイティブで見つけることができる「プレースホルダー」機能を追加する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
        }
    }
}

Identity InspectorでUITextViewオブジェクトのクラスをPlaceholderTextViewに変更したら、Placeholderプロパティを属性インスペクタで正しく設定できます。このコードはアプリの実行時にはうまく機能しますが、インターフェイスビルダーにプレースホルダーテキストは表示されません。また、次のようなノンブロッキングエラーが発生します(設計時にレンダリングされないのはこのためです)。

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

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

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

156
Albert Bori

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

234
Petter

私は数回同じ問題を抱えています。どちらの場合も、ペン先がビューに収まらないときにIBDesignableペン先をストーリーボードにロードしていたときに開始しました(つまり、UIViewからボタンを離してもまだペン先に入っていた)。 xCodeでエラーが発生することを修正したら、ランダムにエラーが発生するまでXcodeを再起動しました。

これが役に立つことを願っています。

更新:私はちょうど "Interface Builder Cocoa Touch Tool"という名前のすべてのプロセスを強制終了し、Xcodeを再起動するとエラーは消えました。これが常にうまくいくかどうかわからない。

50
Dustin Williams

私の場合は、initWithFrame/initWithCoderメソッドで次のようにビューを作成していました。

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

NotMain Bundleを使用することになっていましたが、その代わりにクラス。それで、私はそのコードを次のように置き換えて、それはうまくいきました:

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

多分これは誰かに役立つかもしれないと思った。

39
jmoukel

Interface Builderでカスタムビューを選択してからEditorDebug Selected Viewsを使用できます。すべてのブレークポイント(例外ブレークポイントを含む)が機能すると、いわゆるIBDesignableAgentCocoaTouchデバッグセッションが開始され、ビューがクラッシュした場所を正確に識別できます。

14
Fyodor Volchyok

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()
        }
}
11
Zaid Pathan

Designableをレンダリングする際に同様のInterface Builderの問題が発生していました。

これで提案されたテクニックを使用して 答え 私は問題をイメージリテラルの使用に突き止めることができました。

レンダリングクラッシュ

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

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

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

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

その上、時々それはXcodeの厄介なバグのためだけに起こります。チェックアウトするには、ストーリーボードに入ったら[エディタ]> [ビューの自動更新]のチェックを外してから別のファイルに移動し、プロジェクトを消去して再起動します。ストーリーボードをもう一度入力した後は、[エディタ]> [ビューの更新]をクリックして、自動ストーリーボードをもう一度確認できます。それはまた私の問題を一度解決した。

両方ともうまくいかなかった場合は、おそらくIBDesignableビューについて何か間違ったことをしたことになるので、ストーリーボードでクラッシュしたビューを選択し、Editor> Debug Viewsをクリックしてデバッグします。

6
Yusuf Kamil AK

これはこの質問の場合ではありませんが、多分私は他の誰かを助けます。

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

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

    // custom setup
}

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

    // custom setup
}
4
tzaloga

同じ問題がありましたが、「use_frameworks!」を追加して解決しました。あなたのプロジェクトのPodFileに。それはあなたを助けることができると思います。

4
Jimmy Ng

私の場合、それはOneSignalの問題でした。どうやら、彼らはバージョン2.2.0以降にバグがあります。 2.1.6に切り替えれば、すべてがまた最高です!

this をチェックしてください。

3
Paul Berg

私の場合、それはどういうわけか私が使っていたカルタゴフレームワークに関連していました。私はRunpath Search Paths build設定に$(PROJECT_DIR)/ Carthage/Build/iOSを追加しなければなりませんでした

3
AkademiksQc

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

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

解決策2: - 派生データを削除してみます。 1. Xcodeのエディタウィンドウを閉じてシミュレータを終了します。 - > 2. Xcodeの設定 - >場所 - > 3.派生データパスを示す小さな灰色の矢印をクリックします - > 4.プロジェクトを選択します - > - > 6. Xcodeを終了して再度開く

1
Ashish Pisey

このスクリプトを私の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
Haroldo Gondim

それを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
Tissa

大きな問題は@ IBDesignableがcocoapodを確実にするようにファイルをUITestsに含まないと作成している時です。

1
Modesto Cabrera

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

pod install

これは私のために働きました。それが役に立てば幸い。

0
Dhruv Khatri

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

0

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

0
user6476366

私はこのコード行platform :ios, '7.0'を見逃していただけで、問題は解決されました。ポッドファイルのこの行とポッドの問題を更新するだけで解決されます。

0

プロジェクトに追加されたアセットまたはフォントを使用してUIImageまたはUIFontを直接初期化していないことを確認してください。

私はいつも@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
}
0
Sauvik Dolui