19

カスタム IBDesignable ビューをストーリーボードまたは別の nib に含めると、エージェントがクラッシュし、nib を読み込めないために例外がスローされます。

エラー: IB Designables: 自動レイアウト ステータスの更新に失敗しました: エージェントが "NSInternalInconsistencyException" 例外を発生させました: バンドルに NIB を読み込めませんでした: 'StripyView' という名前の 'NSBundle (loaded)'

ペン先をロードするために使用するコードは次のとおりです。

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

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

func loadContentViewFromNib() {
    let nib = UINib(nibName: String(StripyView), bundle: nil)
    let views = nib.instantiateWithOwner(self, options: nil)
    if let view = views.last as? UIView {
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    }
}

シミュレーターで実行するとビューが nib から正しく読み込まれますが、Interface Builder で表示されないのはなぜですか?

4

2 に答える 2

42

Interface BuilderIBDesignableがビューをレンダリングするとき、ヘルパー アプリを使用してすべてを読み込みます。これの結果はmainBundle、設計時の はヘルパー アプリに関連しており、アプリの ではありませんmainBundle。エラーに記載されているパスは、アプリとは関係がないことがわかります。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays

nib をロードするときは、実行時にbundle: nilデフォルトをアプリに渡すという事実に依存しています。mainBundle

let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)

代わりに、ここで正しいバンドルを渡す必要があります。上記の行を次のように修正します。

let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)

これにより、Interface Builder はカスタム ビュー クラスと同じバンドルから nib をロードします。

これは、カスタム ビューによってバンドルから読み込まれるすべてのものに適用されます。たとえば、ローカライズされた文字列、画像などです。ビューでこれらを使用している場合は、同じアプローチを使用して、カスタム ビュー クラスのバンドルを明示的に渡すようにしてください。

于 2016-02-29T12:58:04.053 に答える
3

"Josh Heald" と同じ観点で、bundle に nil を渡すことはできません。そして、これはオブジェクトの誰のためのものです - C:

- (UIView *) loadViewFromNib{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0];
return v;
}
于 2017-05-16T00:02:32.333 に答える