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は、デバイスまたはシミュレーターで動作します。
最後に、ターゲットのビルド設定に$(CONFIGURATION_BUILD_DIR)
を追加することでこの問題を解決しました 'Runpath Search Paths
フィールド。
さらに、Xcodeで必要な追加の手順がいくつかあります。
~/Library/Developer/Xcode/DerivedData
Editor
メニューに移動し、Refresh All Views
;ビルドが完了するのを待ち、エラーがなくなるはずです@ Mojtabaへのクレジット
Macアプリの構築で同じ問題が発生する場合は、@loader_path/../Frameworks
からRunpath Search Paths
これを解決してくれました。
私にとっては、Xcodeを閉じて再び開くように動作します。エラーなし。ありがとう。
面白い。
最初に、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とは少し異なります。
Xcode 6.4でも同じ問題が発生しました。テストボードメンバーシップをストーリーボードに追加すると、これらのエラーが修正されました。
また、テスト対象には@loader_path/Frameworks
始まる Runpath Search Paths
はテストターゲット用であり、元のターゲットにはありません。
私の場合、別の理由がわかりました。
「エディタ->選択したビューのデバッグ」を使用すると、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に関する注意事項と禁止事項のリストを提供する必要があります...
MacプロジェクトとXcode 7.3.1でもこれを経験しました。私の場合、Failed to Renderエラーメッセージで参照されているフレームワークは、描画とはまったく関係ありませんでした。
ターゲットの[一般/リンクされたフレームワークとライブラリ]タブに移動し、問題のあるフレームワークのステータスを[必須]から[オプション]に変更するだけで、IBDesignablesをIBで適切に更新および描画できました。
OS Xプロジェクトでこの問題が発生しました。
私の場合、問題は古いプロジェクト( [〜#〜] nmssh [〜#〜] )で、ビルド設定が不適切なフレームワークターゲットが含まれていました。具体的には:
INSTALL_PATH
は@executable_path/../Frameworks
に設定されましたが、正しい設定は/Library/Frameworks
ですSKIP_INSTALL
は設定されておらず、デフォルトはNO
ですが、正しい設定はYES
ですDYLIB_INSTALL_NAME_BASE
は設定されていませんでしたが、正しい設定は@rpath
ですすべての正しい設定は、新しく作成されたフレームワークターゲットに対して自動的に取得されるものであることに注意してください。
設定を正しい値に変更した後、Xcodeはストーリーボードの@IBDesignable
ビューを読み込むことができました。
私の場合、次の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];
多分これは誰かを助けるかもしれないと思った。
派生データを消去します。 Xcodeを終了し、再度開きます。
私の場合、プライベートポッド内にあります。 Xcodeバージョン10.3(10G8)
私の場合、解法は非常に単純です-追加するのを忘れただけです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:ここにまだ問題がある
私のフレームワークのビューがパブリック初期化子を持たないことによって引き起こされた同様のエラーがありました:
public override init(frame: CGRect) {
super.init(frame:frame)
commonInit()
}
required public init(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
以下の手順に従ってください: