web-dev-qa-db-ja.com

IB Designablesのインスタンスのレンダリングに失敗しました

Objective-CとSwift混合ダイナミックフレームワークがあります。混合フレームワークは、2つの純粋なObjective-Cダイナミックフレームワークとリンクされていました。

混合フレームワーク内のクラスをIB Designableでマークし、ストーリーボードまたはペン先でそのクラスを使用しようとすると、Xcodeは常にそのインスタンスがレンダリングに失敗したと表示します。

そして、エラーメッセージがありました:

IB Designables:WZUITokenFieldのインスタンスのレンダリングに失敗しました:dlopen(WZUIKit.framework、1):Library not loaded:/Library/Frameworks/WZFoundation.framework/WZFoundation参照元:WZUIKit.framework理由:image not found

IB Designables:自動レイアウトステータスの更新に失敗しました:dlopen(WZUIKit.framework、1):Library not loaded:@ rpath/WZFoundation.framework/WZFoundation参照元:WZUIKit.framework理由:image not found

フレームワークWZUIKitはObjective-Cであり、Swift=混合フレームワークであり、WZFoundationは純粋なObjective-Cです。

さらに、これらのすべてのsutffは、デバイスまたはシミュレーターで動作します。

58
WeZZard

最後に、ターゲットのビルド設定に$(CONFIGURATION_BUILD_DIR)を追加することでこの問題を解決しました 'Runpath Search Pathsフィールド。

さらに、Xcodeで必要な追加の手順がいくつかあります。

  1. プロジェクトのXcode派生データをクリアします。それらは~/Library/Developer/Xcode/DerivedData
  2. を押して現在のビルドをクリーンアップします K
  3. プロジェクトを構築する
  4. ストーリーボードでEditorメニューに移動し、Refresh All Views;ビルドが完了するのを待ち、エラーがなくなるはずです

@ Mojtabaへのクレジット

77
WeZZard

Macアプリの構築で同じ問題が発生する場合は、@loader_path/../FrameworksからRunpath Search Pathsこれを解決してくれました。

18
Alex

私にとっては、Xcodeを閉じて再び開くように動作します。エラーなし。ありがとう。

13
Gabriel

IBDesignablesを含むフレームワークでこのエラーが発生しました。

フレームワークターゲットの_LD_RUNPATH_SEARCH_PATHS_設定に$(FRAMEWORK_SEARCH_PATHS)を追加する必要がありました。

ランパス設定を更新し、ストーリーボードのビューを構築して更新した後、エラーはなくなりました。ビルドフォルダをきれいにする必要さえありませんでした。

enter image description here

5
Scott Marchant

面白い。

最初に、WeZZardの答えは私を正しい方向に導きましたが、正確には私の解決策ではありませんでした。

私のiOSプロジェクトでは、何かがターゲットの_Runpath Search Paths_フィールドをオーバーライドしていました。このように見えた:

_LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
_

$(CONFIGURATION_BUILD_DIR)を追加する彼のソリューションを試しましたが、うまくいきませんでした。動作していなかったため、習慣から構成エントリを削除しました(プロジェクトのデフォルトに戻ります)。すると、次のようにリセットされました。

_LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
_

xcconfigファイルを掘り下げると、Cocoapodsから来ているように見えます。

_@loader_path_がキーであることはAlexと同じように見えますが、iOSではMac OS Xとは少し異なります。

4
hsoi

Xcode 6.4でも同じ問題が発生しました。テストボードメンバーシップをストーリーボードに追加すると、これらのエラーが修正されました。

また、テスト対象には@loader_path/Frameworks 始まる Runpath Search Pathsはテストターゲット用であり、元のターゲットにはありません。

enter image description here

4
CalZone

私の場合、別の理由がわかりました。

「エディタ->選択したビューのデバッグ」を使用すると、CoreGraphicsを使用して画像を作成し、ボタンの背景画像として使用していたため、クラッシュすることがわかりました。

class func imageWithColor(color: UIColor, size: CGSize) -> UIImage {

    let rect = CGRectMake(0.0, 0.0, size.width, size.height);
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0);
    let context = UIGraphicsGetCurrentContext();    // It's alraedy nil here :(

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

}

理由は、サイズが(0.0、0.0)であるためです。何故ですか?呼んでいます

super.setBackgroundImage(UIImage.imageWithColor(bgColor, size: self.bounds.size), forState: .Normal)

しかし、IBではself.bounds.sizeはこの時点ではまだ0です!そこで、1行変更しました。

let rect = CGRectMake(0.0, 0.0, max(size.width, 1.0), max(size.height, 1.0));

そして今、それは動作します:)

Appleは、IBに関する注意事項と禁止事項のリストを提供する必要があります...

3
benjamin.ludwig

MacプロジェクトとXcode 7.3.1でもこれを経験しました。私の場合、Failed to Renderエラーメッセージで参照されているフレームワークは、描画とはまったく関係ありませんでした。

ターゲットの[一般/リンクされたフレームワークとライブラリ]タブに移動し、問題のあるフレームワークのステータスを[必須]から[オプション]に変更するだけで、IBDesignablesをIBで適切に更新および描画できました。

optional status

3
Doug Hanson

OS Xプロジェクトでこの問題が発生しました。

私の場合、問題は古いプロジェクト( [〜#〜] nmssh [〜#〜] )で、ビルド設定が不適切なフレームワークターゲットが含まれていました。具体的には:

  • INSTALL_PATH@executable_path/../Frameworksに設定されましたが、正しい設定は/Library/Frameworksです
  • SKIP_INSTALLは設定されておらず、デフォルトはNOですが、正しい設定はYESです
  • DYLIB_INSTALL_NAME_BASEは設定されていませんでしたが、正しい設定は@rpathです

すべての正しい設定は、新しく作成されたフレームワークターゲットに対して自動的に取得されるものであることに注意してください。

設定を正しい値に変更した後、Xcodeはストーリーボードの@IBDesignableビューを読み込むことができました。

1
rob mayoff

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

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

しかし、メインバンドルではなくクラスのバンドルを使用することになっていたようです。そこで、そのコードを次のコードに置き換えたところ、うまくいきました。

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

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

1
jmoukel

派生データを消去します。 Xcodeを終了し、再度開きます。

0
Vineesh TP

私の場合、プライベートポッド内にあります。 Xcodeバージョン10.3(10G8) produce rendering error

私の場合、解法は非常に単純です-追加するのを忘れただけですpublicの中間に@IBInspectable var

正しいバリアント:

import UIKit

@IBDesignable public class BorderedView: UIView {
    @IBInspectable public var borderColor: UIColor? = UIColor.white {
        didSet {
            if let actualColor = borderColor {
                layer.borderColor = actualColor.cgColor
            } else {
                layer.borderColor = UIColor.white.cgColor
            }

            setNeedsDisplay()
        }
    }
    @IBInspectable public var borderWidth: CGFloat = 1 {
        didSet {
            layer.borderWidth = borderWidth
            setNeedsDisplay()
        }
    }
}

追伸:エディタ->選択したビューのデバッグは私の場合は何もしませんでした

P.S.2:私のプライベートポッドの依存関係からのAlignedCollectionViewFlowLayoutポッドと、この問題に関連しないdefinetelly。

P.S.3:ここにまだ問題がある

0
WINSergey

私のフレームワークのビューがパブリック初期化子を持たないことによって引き起こされた同様のエラーがありました:

public override init(frame: CGRect) {
    super.init(frame:frame)
    commonInit()
}

required public init(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}
0
Leon

以下の手順に従ってください:

  1. ストーリーボードに競合がある場合は、それらを正しく解決し、xmlが正しく検証されているかどうかを確認します(これが主な手順です)。
  2. プロジェクトをきれいにします。
  3. 派生データフォルダーを削除します。
  4. Xcodeを終了し、再起動します。 (これを2回しなければなりませんでした。)
0
komall