web-dev-qa-db-ja.com

@IBDesignableクラッシュエージェント

独自のUIButton- extendedクラスを作成して@IBDesignableにすると、Interface Builderで次の2つのエラーが発生します。

  • Main.storyboard:エラー:IB Designables:自動レイアウトステータスの更新に失敗しました:fdが閉じたため、エージェントがクラッシュしました
  • Main.storyboard:エラー:IB Designables:RandjeUIButtonのインスタンスのレンダリングに失敗しました:エージェントがクラッシュしました

ここに私のコードがあります:

import UIKit

@IBDesignable
class RandjeUIButton: UIButton {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.backgroundColor = UIColor.blackColor()
    }
}

OS X 10.11 beta 2のXcode 7 beta 2で作業しています(VMで実行中)

71
jbehrens94

XcodeのInterface Builderでは、@IBDesignableクラスの初期化子bothまたはneitherを実装して、IBで適切にレンダリングする必要があります。

required init(coder aDecoder: NSCoder)を実装する場合は、init(frame: CGRect)もオーバーライドする必要があります。そうしないと、Xcodeによってスローされるエラーに見られるように、「エージェントがクラッシュします」。

そのためには、クラスに次のコードを追加します。

override init(frame: CGRect) {
    super.init(frame: frame)
}
111
mathielo

私は同じ問題に出会い、この方法で解決しました:

  1. 問題:

エラー:IB Designables:自動レイアウトステータスの更新に失敗しました:エージェントがクラッシュしました

  1. 検査ファイルでデバッグボタンを見つけてクリックします。

debug

  1. 次に、Xcodeは問題の場所を通知します。私の場合、クラスの前にIBDesignableをドロップします。

  2. それから私はそれをきれいにして再構築し、エラーが消えました

23
Azure Yu

Xcode 7.3では、上記の解決策はどれもうまくいきませんでしたが、この質問に対する受け入れられた答えはそうでした: IB Designablesのインスタンスのレンダリングに失敗しました

  1. プロジェクトのXcode派生データをクリアします。これらは〜/ Library/Developer/Xcode/DerivedDataにあります
  2. BuildKを押して現在のビルドをクリーンアップします
  3. プロジェクトを構築する
  4. ストーリーボードで[エディター]メニューに移動し、[すべてのビューを更新]を実行します。ビルドが完了するのを待ち、エラーがなくなるはずです

問題を解決するために4番目のステップを実行する必要はありませんでした(そして、PaintCode-drawRect'd UIViewをストーリーボードにペイントします)。

@ Mojtabaおよび@WeZZardへのクレジット

11
Glenn Barnett

これを引き起こす可能性がある無数の問題があります。コンソールを起動し、クラッシュレポートIBDesignablesCocoaTouch...を探します

valueForKeyのセマンティクスに問題があるサードパーティの設計可能なものに関する問題を整理しました。

10
voidref

私にとっては、#if !TARGET_INTERFACE_BUILDERを使用していなかったからです。基本的に、バンドル内のパスにアクセスするコードがいくつかありました...

Bundle.main.path(forResource: "Foo", ofType: "plist")

問題は、(アプリではなく)IBで実行しているとき、Bundle.mainはアプリではないということです...

(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)

したがって、これに対する答えは、設計で実行するときに意味をなさないもの(たとえば、私の場合はCoreLocationを呼び出す)に@IBDesignable UIViewコードを注意深く確認し、#if !TARGET_INTERFACE_BUILDERを使用することです。時間。

デバッグしてこれを見つけた方法

これは、ストーリーボードでEditor -> Debug Selected Viewを選択しているときに@IBDesignable UIViewを使用したときに表示されるものです。

This is what you see when using the <code>Editor -> Debug Selected View</code> while selecting your <code>@IBDesignable UIView</code> in your storyboard

その後、適切な場所でクラッシュします

The Debug Navigator

私の場合、initXXXXassertを実行していたことがわかりますが、設計時にクラッシュしていました。これは、設計時にBundleのファイルの値を探していたためです。

9
StuFF mc

@IBDesignableとマークされたクラスでUIImageを使用するとき、何か重要なことがわかりました。従来のUIImage initはエージェントをクラッシュさせます。

let myImage = UIImage(named: String) // crash the agent

解決策は、UIImageの次のinitメソッドを使用することです。

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)

作業コードの例:

let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))

Selfは、@ IBDesignableキーワードを使用したクラスです。 Xcode 9.4、Swift 4.1

7
Adrien Yvon

XCode 10、Swift 4.2

答えを見つけました こちら

解決策は簡単でした。カスタムビュークラスのrequired init?(coder aDecoder: NSCoder)メソッドでバンドルの解決方法を変更しました。

    Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

に変更する必要がありました

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
2
escapedcanadian

別のXcodeセットアップシステムでコードを再度開くだけです。私の場合、うまくいきました。

2
Charmi

私はこれで丸一日を無駄にし、最終的に問題を解決しました enter image description here

ターゲットとしてBuildを8.0として選択すると、すべてが修正されます。

1
Sam

これは私がこの問題を解決する方法です:

  • コンセントが適切に初期化されていることを確認してください
  • @IBInspectableプロパティは適切に初期化されます
  • xibファイルで、ファイルの所有者プレースホルダーをクリックし、IDインスペクターに移動して、デフォルト値がないことを確認します
import UIKit

@IBDesignable class TestView: UIView {
    
    @IBOutlet weak var label: UILabel!
    
    
    @IBInspectable var textLabel1: String? {
        get {
            return label.text
        }
        set {
            label.text = newValue
        }
    }

    
    // MARK: Setup
    
    var view1: UIView!
    var nibName: String = "TestView"
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        xibSetup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        xibSetup()
    }
    
    private func xibSetup() {
        view1 = loadViewFromNib()
        
        view1?.frame = self.bounds
        view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        
        if view1 != nil {
            addSubview(view1!)
            //textLabel1 = "ok"
        }
    }
    
    private func loadViewFromNib() -> UIView? {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        for object in nib.instantiateWithOwner(self, options: nil) {
            if let view: UIView = object as? UIView {
                return view
            }
        }
        return nil
    }
    
    
}

使用法:

enter image description here

1