web-dev-qa-db-ja.com

IB Designables:自動レイアウトステータスのレンダリングと更新に失敗しました

内部にxibを持つカスタムビュー(UIButton)があり、次のようにID IBDesignableを作成しました。

serView.Swift

import UIKit

@IBDesignable
class UserView: UIView {

    @IBOutlet var view: UIView!
    @IBOutlet weak var userButton: UIButton!

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

    }

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

    fileprivate func load() {
        Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
        addSubview(view)
        self.frame = bounds
    }

}

serView.xib

  • UIButtonを追加し、制約を設定しました
  • ファイルの所有者を設定します:UserView

絵コンテ

UIViewをBar Button Itemに追加し、UserViewクラスを割り当てましたが、何もレンダリングされず、次のビルドエラーが発生しました。

エラー:IB Designables:FoodViewControllerの自動レイアウトステータスのレンダリングと更新に失敗しました(bR3-Kz-wX7):エージェントは例外をスローしました。

現在の環境:Xcode 9、Swift 4

25

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

私はまったく同じ問題を抱えていましたが、私にとっては、メインのバンドルを使用する代わりに、必要なペン先のバンドルを取得する必要がありました。本質的に変化:

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

に:

let bundle = Bundle(for: UserView.self)
bundle.loadNibNamed("UserView", owner: self, options: nil)

私の場合のように、LLDBで実行時に2つのバンドルを比較すると、それらは同一でした(クラス名は異なりますが、残りのセットアップはOPと同一でした)

lldb screenshot

24
Mike Velu

Xcode 9.3、CocoaPods 1.5.3CocoaPodsバージョンの最近の更新が原因である可能性があります。 issue here を参照してください。

ストーリーボード、Cocoapodsに関連するStripe SDKのクラスSTPPaymentCardTextFieldにこのエラーIB Designables: Failed to render and update auto layout statusがありました。

解決策は、CocoaPodsを1.4.0にダウングレードすることです

Sudo gem list cocoapods

Sudo gem uninstall cocoapods

Sudo gem install cocoapods -v 1.4.0

pod update
6
Cons Bulaquena

この質問はこの回答に関連しています。両方を確認してください。
ClassNameのインスタンスのレンダリングに失敗しました:エージェントは、nibをバンドルにロードする例外をスローしました

ボトムライン

Xibファイルに孤立したアウトレットがないことを確認してください。アウトレットのペン先の各ビュー/要素を確認し、削除して再度追加します。

A nib subview with an outlet

私にとって、それらは孤立したコンセントでした。ペン先とIBは非常に細かく、デバッガは多くの詳細を提供していないようです...これが機能しない場合は、新しいnib/xibファイルから始めるかもしれません。


私の作業コードのウォークスルー

この問題の解決には数日かかりました。他の人の利益のために、私は冗長な答えを与え、すべての関連するコードと接続を示しています。

修正アクション(上記)を実装したコミットは次のとおりです。 https://github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Xcodeバージョン9.2

私のファイル構造

ファイル構造は次のとおりです(注:ZMAppFoundationという名前のココアポッドでポッドを作成しています。また、ZMPieTimerView.Swiftはソリューションに関連していません。):

enter image description here

Main.storyboardファイルでニブを表示可能(IBDesignable)にしたいここにファイルの所有者とxibのカスタムクラス、ZMGauge.xib

File's OwnerCustom Class

コード、実装

これが私のZMXibViewクラスです。

//  Adapted from https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d

import UIKit

@IBDesignable
open class ZMXibView: UIView {


    var contentView:UIView?
    @IBInspectable var nibName:String?

    override open func awakeFromNib() {
        super.awakeFromNib()
        xibSetup()
    }

    func xibSetup() {
        guard let view = loadViewFromNib() else { return }
        view.frame = bounds
        view.autoresizingMask =
            [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        guard let nibName = nibName else { return nil }
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(
            withOwner: self,
            options: nil).first as? UIView
    }

    override open func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        xibSetup()
        contentView?.prepareForInterfaceBuilder()
    }
}

ストーリーボードでは、私のxibはカスタムクラスに指定されています。私はココアポッドを使用してポッドを開発しています。モジュールを明示的に選択しました。 (私のXibViewクラスでは、nibNameプロパティを定義する必要があることに注意してください。):

Setting custom class on the xib

忘れないで!

その後、クリーニング、Xcodeの終了、再構築、またはIBが再度レンダリングするまでしばらく待つ必要があります。 XcodeがIBDesignablesのレンダリングを試みることをいつ決定するかは、私にはまだ謎であり、強制する方法がわかりません。

成功

私のコードと私が取ったアクションに基づいて、私のペン先はMain.storyboardでIBDesignableで表示可能になりました。

nib is viewable now

逃した場合に備えて

あなたがそれを見逃した場合に備えて、私のソリューションはこの投稿の一番上にあります。私は、いくつかの孤立したIBOutletsを削除することで、OPによって引用されたエラーをクリアしました。

5
Jacob Davis

(xCode 9.2、Swift 4)以下はあなたの正確な問題には役立たないかもしれませんが、非常に似た問題を持つ他の人には役立つかもしれません。これは私のエラーでした:

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

CustomExampleView.xibおよびCustomExampleView.Swiftを削除するときのエラーを削除できました。複製するために、ファイルを再作成し、.xibに移動して、トップレベルビューのカスタムクラスをCustomExampleViewに設定しました。

私のmistakeは、File's Ownerにカスタムクラスを設定する代わりに、.xibのトップレベルビューにカスタムクラスを設定していました。適切なカスタムクラスを設定した後、私の問題は解決しました。

3
olearyj234

私にとって、修正はInterface Builderにオブジェクトを再描画させることに帰着しました。これを2か所で行い、コードを変更せずに両方を修正しましたが、エージェントエラーの症状とストーリーボードの空白のビューは最終的に修正されました。

1つは、UIViewをビューの下の別の順序にドラッグして再構築することで修正されました。 TableViewを使用したTableViewの2番目のセルは、TableViewを選択し、Prototypeセルのカウントを2に変更し、1秒待ってから1に戻すことで修正されました。白い空白だったTableViewは、すべての要素を正しく描画し、エージェントエラーはなくなりました。

IBのバグのように感じます。他の検索からも、同様のエラーに対する多くの解決策が存在します。これが誰かを助けることを願っています。

2
FiveOhHO

私があなたに伝えようとしていることをすることが違いを生むことはどれほど愚かだと思いますが、破壊的なコードを削除してみることができます

override func prepareForInterfaceBuilder() {

でのみ使用する

override func awakeFromNib() {

。これを行うと、変更がストーリーボードに希望どおりに反映される可能性があることを報告すると、さらに多くなります。

すべての行をコメントアウトし、消去のプロセスを使用して中断行を識別することにより、中断コードを識別できます。

2
ScottyBlades
    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

Podfileに上記のコードを入力すると、問題が解決します。このコードは、Cocoapodsを介してインストールされたフレームワークのコード署名の要件を排除します。しかし、Xcode 10ベット4を使用しているため、これはIBDesignableのバグのようです。Xcode10に組み込まれた新しいビルドシステムのため、このバグは発生しません。

2
Nikhil Pandey

これは、1.5.0などの一部のココアポッドの問題です。これを使用している場合、レンダリングが現在のバージョンから他のバージョンに移動できず、ターミナルでこのコマンドを実行する

Sudo gem uninstall cocoapods

このように言及することにより、特定のバージョンをインストールできます

Sudo gem install cocoapods -v 1.4.0

それがあなたのために働くことを願っています。

1
Shaheryar Malik

私にとってこの問題は

  1. ポッドの更新。
  2. Swiftライブラリの組み込みオプションのビルド設定を '$(inherited)'に変更します。
  3. 建物、掃除、建物。
  4. プロジェクトを終了します。
  5. Xcodeを終了します。
  6. 再度実行します。

ハハハ古いハック:)ありがとう!

1
Najam

私はこれの原因についてあまり知りませんが、これを数回見ましたが、Xcodeを再起動するだけで修正されます。それは誰もが始めるべき場所であり、それがうまくいかない場合は、他の提案された答えを試すことができると思います。

0

残念ながら、IBDesignable内でIBOutletsを使用することはできません。ここであなたのためのより良い答え:

IBInspectableプロパティを介したライブレンダリングIBOutlet接続サブビュー

おそらく、あなたはUserViewにUIViewではなくUIButtonを拡張させたいのでしょうか?

0
Mars